Exemple #1
0
        /// <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));
        }