/// <summary> /// Assumes full sized sheet as input. Draws grid, points and axis /// </summary> public override void DrawSeriesAndAxis(FivePointNine.Windows.Graphics.Graphics2 g) { if (DataSeries == null) // only in the designer { return; } if (!DataSeries.Enabled) { return; } string YUnit = DataSeries.YUnits.ToString(); var yLabelSz = g.MeasureString(YUnit, Font); var xLabelSz = g.MeasureString(XUnit, Font); YLabelWidth = yLabelSz.Height * 2; XLabelHeight = xLabelSz.Height * 2; g.DrawString(YUnit, Font, Color.Black, Width - YLabelWidth / 2 * 1.5F, (Height - XLabelHeight) / 2 + yLabelSz.Width / 2, -90); g.DrawString(XUnit, Font, Color.Black, (Width - YLabelWidth) / 2, Height - XLabelHeight * 1.5F / 2.0F); if (DataSeries != null) { g.SmoothingMode = SmoothingMode.AntiAlias; g.Clip = new Region(DrawPlotArea); DataSeries.Draw(g, (int)DrawPlotArea.Width, (int)(Height - XLabelHeight), xOffsetG, yOffsetG, XPPU, YPPU, false); } g.Clip = new Region(new RectangleF(0, 0, Width, Height)); }
public void DrawTasksAfterSeriesPlot(FivePointNine.Windows.Graphics.Graphics2 g) { if (showCursorX) { var f = Font; var CursorV = GtoV(CursorG); var strSz = g.MeasureString(roundedFrac(CursorV.X, 3), f); g.FillRectangle(BackColor, CursorG.X, Height - XLabelHeight - strSz.Height, strSz.Width, strSz.Height); g.DrawString( roundedFrac(CursorV.X, 3), f, Color.Black, new PointF(CursorG.X, Height - XLabelHeight - strSz.Height)); g.DrawLine(Pens.Black, CursorG.X, 0, CursorG.X, Height - 20); } if (showCursorY) { var f = Font; var CursorV = GtoV(CursorG); var strSz = g.MeasureString(roundedFrac(CursorV.Y, 3), f); g.FillRectangle(BackColor, Width - strSz.Width - XLabelHeight, CursorG.Y, strSz.Width, strSz.Height); g.DrawString( roundedFrac(CursorV.Y, 3), f, Color.Black, new PointF(Width - strSz.Width - XLabelHeight, CursorG.Y)); g.DrawLine(Pens.Black, 0, CursorG.Y, Width, CursorG.Y); } if (TimeUndershootInDisplay()) { RightLimitImage.Draw(g, TentativeOp == MoveOp.goToZero); } InScale = true; if (MinValueOvershootInDisplay()) { DownLimitImage.Draw(g, TentativeOp == MoveOp.resetScale); InScale = false; } if (MaxValueOvershootInDisplay()) { UpLimitImage.Draw(g, TentativeOp == MoveOp.resetScale); InScale = false; } if (InScale) { AutoScaleRequested = false; } if (!InScale && AutoScaleRequested) { AutoSetScale(); } }
public static RectangleF drawXYAxis(FivePointNine.Windows.Graphics.Graphics2 g, float w, float h, float xs, float ys, float xog, float yog, bool grid, Color backColor, Font Font) { RectangleF drawingRect = new RectangleF(0, 0, w, h); // X Axis var axisP = new Pen(Color.DarkGray, 1.5F); var majLine = new Pen(Color.FromArgb(155, 155, 155), 1F); var minLine = new Pen(Color.FromArgb(200, 200, 200), 1F); float unitX = 1e-8F; float multF = 5; // determine scale first while (unitX * xs < Font.Height * 2.2F) { unitX *= multF; multF = multF == 2 ? 5 : 2; } if (unitX < 1e-8 || unitX > 1e8) { return(drawingRect); } float minX = 0, maxX = 0; while (minX * xs < -xog) { minX += unitX; } while (minX * xs > -xog) { minX -= unitX; } while (maxX * xs > w - xog) { maxX -= unitX; } while (maxX * xs < w - xog) { maxX += unitX; } Font f = new Font("ARIAL", Font.Height * 0.5F); int yaWid = f.Height * 4; int xaHei = (f.Height * 15 / 10); drawingRect = new RectangleF(0, 0, w - yaWid, h - xaHei); bool isMinLine = false; var xSigFiguresAfterD = 0; var totalFigs = (unitX / 2 - Math.Floor(unitX / 2)).ToString().Length - 2; while (Math.Round(unitX, xSigFiguresAfterD) == Math.Round(unitX / 2, xSigFiguresAfterD) && xSigFiguresAfterD <= totalFigs) { xSigFiguresAfterD++; } for (float i = minX; i <= maxX; i += unitX / 2) { PointF drawableMid = VtoG(new PointF(i, 0), xog / xs, xs, yog / ys, ys, h); drawableMid = new PointF(drawableMid.X, h); if (!isMinLine) { PointF drawable1 = new PointF(drawableMid.X, drawableMid.Y - 1.5F); PointF drawable2 = new PointF(drawableMid.X, drawableMid.Y + 1.5F); if (grid) { drawable1 = new PointF(drawable1.X, 0); } if (grid) { drawable2 = new PointF(drawable2.X, h - xaHei); } string s = roundedFrac(i, xSigFiguresAfterD); var xyo = g.MeasureString(s, f); PointF drawableStrPos = new PointF(drawableMid.X - xyo.Width / 2, drawableMid.Y - xyo.Height - 2); if (drawable1.X < w - yaWid && drawable1.X > 0) { g.DrawLine(majLine, drawable1, drawable2); g.DrawString(s, f, Color.Gray, drawableStrPos); } } else { //PointF drawable1 = new PointF(drawableMid.X, drawableMid.Y - 1); //PointF drawable2 = new PointF(drawableMid.X, drawableMid.Y + 1); //if (grid) drawable1 = new PointF(drawable1.X, 0); //if (grid) drawable2 = new PointF(drawable2.X, h - 15); //if (drawable1.X < w - 30 && drawable1.X > 0) // g.DrawLine(minLine, drawable1, drawable2); } isMinLine = !isMinLine; } if (xog < w - yaWid && xog > 0) { g.DrawLine(axisP, xog, 0, xog, h - 15); } // Y Axis float unitY = 1e-6F;; multF = 5; // determine scale first while (unitY * ys < Font.Height * 1.5F) { unitY *= multF; multF = multF == 2 ? 5 : 2; } if (unitY < 1e-7 || unitY > 1e7) { return(drawingRect); } float minY = 0, maxY = 0; while (minY * ys < -yog) { minY += unitY; } while (minY * ys > -yog) { minY -= unitY; } while (maxY * ys > h - yog) { maxY -= unitX; } while (maxY * ys < h - yog) { maxY += unitY; } isMinLine = false; var ySigFiguresAfterD = 0; totalFigs = (unitY / 2 - Math.Floor(unitY / 2)).ToString().Length - 2; while (Math.Round(unitY, ySigFiguresAfterD) == Math.Round(unitY / 2, ySigFiguresAfterD) && ySigFiguresAfterD <= totalFigs) { ySigFiguresAfterD++; } for (float i = minY; i <= maxY; i += unitY / 2) { PointF drawableMid = VtoG(new PointF(0, i), xog / xs, xs, yog / ys, ys, h); drawableMid = new PointF(w, drawableMid.Y); if (!isMinLine) { PointF drawable1 = new PointF(drawableMid.X - 1.5F, drawableMid.Y); PointF drawable2 = new PointF(drawableMid.X + 1.5F, drawableMid.Y); if (grid) { drawable1 = new PointF(0, drawable1.Y); } if (grid) { drawable2 = new PointF(w - yaWid, drawable2.Y); } string s = roundedFrac(i, ySigFiguresAfterD); var xyo = g.MeasureString(s, f); PointF drawableStrPos = new PointF(drawableMid.X - xyo.Width, drawableMid.Y - xyo.Height / 2 - 2); if (drawable2.Y < h - xaHei && drawable2.Y > 0) { g.DrawLine(majLine, drawable1, drawable2); g.DrawString(s, f, Color.Gray, drawableStrPos); } } else { //PointF drawable1 = new PointF(drawableMid.X - 1F, drawableMid.Y); //PointF drawable2 = new PointF(drawableMid.X + 1F, drawableMid.Y); //if (grid) drawable1 = new PointF(0, drawable1.Y); //if (grid) drawable2 = new PointF(w - 30, drawable2.Y); //if (drawable2.Y < h - 15 && drawable2.Y > 0) // g.DrawLine(minLine, drawable1, drawable2); } isMinLine = !isMinLine; } g.DrawLine(axisP, 0, h - yog, w - yaWid, h - yog); g.DrawRectangle(axisP, drawingRect); return(drawingRect); }
public override void DrawSeriesAndAxis(FivePointNine.Windows.Graphics.Graphics2 g) { if (dsCollection == null) { return; } string YUnit = dsCollection[0].YUnits.Name; string unit = dsCollection[0].YUnits.Unit; bool noUnit = false; for (int i = 1; i < dsCollection.Count; i++) { if (!dsCollection[i].Enabled) { continue; } if (unit != dsCollection[i].YUnits.Unit) { noUnit = true; break; } if (!YUnit.Contains(dsCollection[i].YUnits.Name)) { YUnit += ", " + dsCollection[i].YUnits.Name; } } if (noUnit) { YUnit = "Error -- Incompatible units"; } else { YUnit += " (" + dsCollection[0].YUnits.Unit + ")"; } var yLabelSz = g.MeasureString(YUnit, Font); var xLabelSz = g.MeasureString(XUnit, Font); YLabelWidth = yLabelSz.Height * 2; XLabelHeight = xLabelSz.Height * 2; g.Clip = new Region(DrawPlotArea); g.DrawString(YUnit, Font, Color.Black, Width - YLabelWidth / 2 * 1.5F, (Height - XLabelHeight) / 2 + yLabelSz.Width / 2, -90); g.DrawString(XUnit, Font, Color.Black, (Width - YLabelWidth) / 2, Height - XLabelHeight * 1.5F / 2.0F); g.SmoothingMode = SmoothingMode.AntiAlias; foreach (var DataSeries in dsCollection.SeriesList) { if (DataSeries != null) { if (DataSeries.Enabled) { if (DataSeries != HoverOver) { DataSeries.Draw(g, (int)DrawPlotArea.Width, (int)(Height - XLabelHeight), xOffsetG, yOffsetG, XPPU, YPPU, false); } } } } if (HoverOver != null) { HoverOver.Draw(g, (int)DrawPlotArea.Width, (int)DrawPlotArea.Height, xOffsetG, yOffsetG, XPPU, YPPU, false); } g.Clip = new Region(new RectangleF(0, 0, Width, Height)); }