private void RepopulateScaleMenus() { foreach (ToolStripMenuItem item in scaleMenuItems) { item.DropDownItems.Clear(); if (plot == null) { item.Enabled = false; return; } else { item.Enabled = true; } foreach (KeyValuePair <string, NumericYAxis> kv in plot.YAxes) { NumericAxis axis = kv.Value; if (axis.Visible) { ToolStripMenuItem newitem = new ToolStripMenuItem(axis.Title); newitem.Click += delegate(object sender, EventArgs e) { ManuallyScale(axis); }; item.DropDownItems.Add(newitem); } } } }
public override void Draw(Graphics g, AxisCollection yAxisCollection, XAxis xAxis, AdvancedRect area) { if (data.Count == 0) { return; } GraphicsState _s = g.Save(); g.SmoothingMode = SmoothingMode.AntiAlias; NumericAxis yAxis = yAxisCollection[YAxisName]; using (Pen p = line.CreatePen()) using (Symbol s = (SymbolStyle != SymbolStyle.NoSymbols) ? symbol.CreateSymbol() : null) { // find continuous groups of non-null Y points // if our yAxis is LogRate, then we need to find continuous // groups of non-null, >0 Y points. Yay. int start = 0, end = 0, i = 0; while (i < data.Count) { // chomp all nulls // then draw all non-nulls while (i < data.Count && (data.GetY(i) == null || (yAxis.LogAxis && data.GetY(i) <= 0))) { i++; } // found a non-null at i. start = i; while (i < data.Count && data.GetY(i) != null && (!yAxis.LogAxis || data.GetY(i) > 0)) { i++; } // found a null at i; end = i; if (start != end) { drawLines(g, p, s, xAxis, yAxis, area, start, end); } } } g.Restore(_s); }
public ManualNumericAxisForm(NumericAxis axis) { this.axis = axis; InitializeComponent(); minAutoButton.Checked = (axis.UserMinimum == null); minManualButton.Checked = !minAutoButton.Checked; maxAutoButton.Checked = (axis.UserMaximum == null); maxManualButton.Checked = !maxAutoButton.Checked; if (axis.UserMinimum.HasValue) { minValueBox.Text = axis.FormatLabel(axis.UserMinimum.Value); } if (axis.UserMaximum.HasValue) { maxValueBox.Text = axis.FormatLabel(axis.UserMaximum.Value); } UpdateEnabling(); }
public override void Draw(Graphics g, AxisCollection yAxisCollection, XAxis xAxis, AdvancedRect area) { if (data.Count == 0) { return; } GraphicsState _s = g.Save(); g.SmoothingMode = SmoothingMode.AntiAlias; NumericAxis yAxis = yAxisCollection[YAxisName]; double[] baseY = new double[data.Count]; if (yAxis.LogAxis) { for (int i = 0; i < data.Count; i++) { baseY[i] = yAxis.ScaleMinimum; } } else { for (int i = 0; i < data.Count; i++) { baseY[i] = 0; } } for (int ySet = 0; ySet < data.GetY(0).Length; ySet++) { PointF[] polygon = new PointF[data.Count * 2]; PointF[] line = new PointF[data.Count]; int j = 0; for (int i = (data.Count - 1); i >= 0; i--, j++) { polygon[j] = new PointF( xAxis.DataToCoordinate(data.GetX(i), area), yAxis.DataToCoordinate(baseY[i], area) ); } for (int i = 0; i < data.Count; i++, j++) { double?y = data.GetY(i)[ySet]; if (y == null) { y = baseY[i]; } else { y = baseY[i] + y.Value; } polygon[j] = new PointF( xAxis.DataToCoordinate(data.GetX(i), area), yAxis.DataToCoordinate(y.Value, area) ); line[i] = polygon[j]; baseY[i] = y.Value; } if (brushes.Count != 0) { int idx = ySet % brushes.Count; using (Brush br = brushes[idx].CreateBrush()) g.FillPolygon(br, polygon); } if (pens.Count != 0 && line.Length >= 2) { int idx = ySet % pens.Count; using (Pen p = pens[idx].CreatePen()) g.DrawLines(p, line); } } g.Restore(_s); }
private void drawLines(Graphics g, Pen p, Symbol s, XAxis xAxis, NumericAxis yAxis, AdvancedRect area, int start, int end) { PointF[] pt; int count = end - start; if (stepLine) { if (end == data.Count && count == 1) { // drawing a single point at the end going nowhere, // not possible. fixme: make a symbol or something to // indicate a single point? return; } pt = new PointF[count * 2 - (end == data.Count ? 1 : 0)]; for (int i = 0; i < count; i++) { pt[i * 2].X = xAxis.DataToCoordinate(data.GetX(start + i), area); pt[i * 2].Y = yAxis.DataToCoordinate(data.GetY(start + i).Value, area); if ((start + i + 1) < data.Count) { pt[(i * 2) + 1].X = xAxis.DataToCoordinate(data.GetX(start + i + 1), area); pt[(i * 2) + 1].Y = pt[i * 2].Y; } } } else { if (count == 1) { // can't really draw a line here. // fixme: make a symbol or something to indicate a single // point? return; } pt = new PointF[count]; for (int i = 0; i < count; i++) { pt[i].X = xAxis.DataToCoordinate(data.GetX(start + i), area); pt[i].Y = yAxis.DataToCoordinate(data.GetY(start + i).Value, area); } } g.DrawLines(p, pt); switch (SymbolStyle) { case SymbolStyle.IdentifyPoints: foreach (PointF x in pt) { s.DrawCenteredAt(g, x); } break; case SymbolStyle.IdentifyLine: PointF lastPt = pt[0]; for (int i = 1; i < pt.Length; i++) { PointF curPt = pt[i]; double dist = Math.Sqrt(Math.Pow(curPt.X - lastPt.X, 2) + Math.Pow(curPt.Y - lastPt.Y, 2)); if (dist > 0.5) { s.DrawCenteredAt(g, curPt); lastPt = curPt; } } break; } }
private void ManuallyScale(NumericAxis axis) { ManualNumericAxisForm form = new ManualNumericAxisForm(axis); form.ShowDialog(); }