Пример #1
0
        public static List <PiePartGeometry> GetPieChart(ICanvasResourceCreator resourceCreator,
                                                         float[] valueList, ChartTextFormat textFormat, float radius, bool isShowData)
        {
            var centerPoint = new Vector2(radius, radius);
            var geoList     = new List <PiePartGeometry>();
            var sum         = valueList.Sum();
            var startAngle  = 0f;
            var percentList = valueList.Select(o => o / sum);

            foreach (var item in percentList)
            {
                var radian  = item * 2 * Math.PI;
                var builder = new CanvasPathBuilder(resourceCreator);
                builder.BeginFigure(centerPoint);
                builder.AddArc(centerPoint, radius, radius, startAngle, (float)radian);
                builder.EndFigure(CanvasFigureLoop.Closed);

                if (isShowData)
                {
                    var partCenter = new Point(
                        (radius - textFormat.Thickness.Top) * Math.Cos(startAngle + radian / 2) + centerPoint.X,
                        (radius - textFormat.Thickness.Top) * Math.Sin(startAngle + radian / 2) + centerPoint.Y)
                                     .ToVector2();
                    var textLayout = ChartDrawHelper.CreateCanvasText(resourceCreator,
                                                                      $"{string.Format("{0:F1}", item * 100)}%", textFormat);
                    var textRect = textLayout.DrawBounds;
                    var textPos  = new Point(partCenter.X - textRect.Width / 2, partCenter.Y - textRect.Height / 2);
                    var part     = new PiePartGeometry
                    {
                        ShapeGeometry = CanvasGeometry.CreatePath(builder),
                        TextGeometry  = CanvasGeometry.CreateText(textLayout),
                        DataRect      = new Rect(textPos, new Size(textRect.Width, textRect.Height))
                    };
                    geoList.Add(part);
                    builder.Dispose();
                    textLayout.Dispose();
                }
                else
                {
                    var part = new PiePartGeometry
                    {
                        ShapeGeometry = CanvasGeometry.CreatePath(builder)
                    };
                    geoList.Add(part);
                    builder.Dispose();
                }
                startAngle += (float)radian;
            }
            return(geoList);
        }
Пример #2
0
 public void EndLines()
 {
     if (_linesPath != null)
     {
         using (var g = CanvasGeometry.CreatePath(_linesPath)) {
             _c.DrawGeometry(g, wcolor, _lineWidth);
         }
         _linesPath.Dispose();
         _linesPath = null;
     }
 }
Пример #3
0
        public void Reset()
        {
            Debug.Assert(_native != null);
            var native = _native;

            if (native != null)
            {
                native.Dispose();
                _native = null;
            }
            _builder?.Dispose();
        }
Пример #4
0
 protected virtual void Dispose(Boolean disposing)
 {
     if (!disposed)
     {
         if (disposing == true && _cpb != null)
         {
             _cpb.Dispose();
             _cpb = null;
         }
         disposed = true;
     }
 }
Пример #5
0
 private void Dispose(bool disposing)
 {
     if (disposing)
     {
         if (pathBuilder != null)
         {
             pathBuilder.Dispose();
         }
         if (geometry != null)
         {
             geometry.Dispose();
         }
     }
 }
Пример #6
0
        public void DrawBezier(CanvasDrawingSession g2d, List <CalcPoint> pointslist, int xoffset, int yoffset, Color bordercolor, float linesize)
        {
            CanvasDevice      device = CanvasDevice.GetSharedDevice();
            CanvasGeometry    geometry;
            CanvasPathBuilder pathBuilder = new CanvasPathBuilder(device);

            pathBuilder.BeginFigure(new Vector2(pointslist[0].X + xoffset, pointslist[0].Y + yoffset));
            pathBuilder.AddCubicBezier(new Vector2(pointslist[1].X + xoffset, pointslist[1].Y + yoffset),
                                       new Vector2(pointslist[2].X + xoffset, pointslist[2].Y + yoffset), new Vector2(pointslist[3].X + xoffset, pointslist[3].Y + yoffset));
            pathBuilder.EndFigure(CanvasFigureLoop.Open);
            geometry = CanvasGeometry.CreatePath(pathBuilder);
            pathBuilder.Dispose();

            g2d.DrawGeometry(geometry, bordercolor, linesize);
            geometry.Dispose();
        }
Пример #7
0
        public static List <BarGroupGeometry> GetBarChart(ICanvasResourceCreator resourceCreator,
                                                          List <float[]> valuesList, float height, float barWidth, float barBorderWidth,
                                                          float barGap, float groupGap, ChartTextFormat dataLabelFormat)
        {
            var geoList       = new List <BarGroupGeometry>();
            var max           = valuesList.Select(o => o.Max()).Max();
            var barNum        = valuesList.Count;
            var totalGroupGap = (barWidth + barBorderWidth + barGap) * barNum + groupGap - barGap;
            var offset        = 0f;

            foreach (var list in valuesList)
            {
                var builder      = new CanvasPathBuilder(resourceCreator);
                var heightList   = list.Select(o => (float)(o / max * height)).ToArray();
                var startPoint   = new Vector2();
                var markerPoints = new List <Vector2>();
                var markerStrs   = new List <string>();
                for (int i = 0; i < heightList.Count(); i++)
                {
                    builder.BeginFigure(startPoint);
                    builder.AddLine(new Vector2(startPoint.X, startPoint.Y - heightList[i]));
                    builder.AddLine(new Vector2(startPoint.X + barWidth, startPoint.Y - heightList[i]));
                    builder.AddLine(new Vector2(startPoint.X + barWidth, startPoint.Y));
                    builder.EndFigure(CanvasFigureLoop.Open);

                    var markerPoint = new Vector2(startPoint.X + barWidth / 2, startPoint.Y - heightList[i]);
                    markerPoints.Add(markerPoint);
                    markerStrs.Add($"{list[i]}");

                    startPoint = new Vector2(startPoint.X + totalGroupGap, startPoint.Y);
                }
                geoList.Add(new BarGroupGeometry
                {
                    ShapeGeometry = CanvasGeometry.CreatePath(builder),
                    DataLabels    = ChartDrawHelper.CreateValueMarker(resourceCreator, dataLabelFormat, markerPoints,
                                                                      markerStrs,
                                                                      MarkerPosition.Bottom),
                    Offset = offset
                });
                builder.Dispose();
                offset += barGap + barWidth + barBorderWidth;
            }
            return(geoList);
        }
Пример #8
0
        public CanvasGeometry GetGeometry(CanvasDevice device)
        {
            var fill = FillType == PathFillType.Winding
                ? CanvasFilledRegionDetermination.Winding
                : CanvasFilledRegionDetermination.Alternate;

            CanvasGeometry finalGeometry = null;

            var canvasPathBuilder = new CanvasPathBuilder(device);

            canvasPathBuilder.SetFilledRegionDetermination(fill);

            var closed = true;

            for (var i = 0; i < Contours.Count; i++)
            {
                Contours[i].AddPathSegment(ref finalGeometry, canvasPathBuilder, device, ref closed);
                if (finalGeometry != null)
                {
                    canvasPathBuilder.Dispose();
                    canvasPathBuilder = new CanvasPathBuilder(device);
                    canvasPathBuilder.SetFilledRegionDetermination(fill);
                }
            }

            if (!closed)
            {
                canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);
            }

            if (finalGeometry == null)
            {
                finalGeometry = CanvasGeometry.CreatePath(canvasPathBuilder);
            }
            canvasPathBuilder.Dispose();

            return(finalGeometry);
        }
Пример #9
0
        public static CanvasGeometry AsPath(this PathF path, float ox, float oy, float fx, float fy, ICanvasResourceCreator creator, CanvasFilledRegionDetermination fillMode = CanvasFilledRegionDetermination.Winding)
        {
            var builder = new CanvasPathBuilder(creator);

#if DEBUG
            try
            {
#endif
            builder.SetFilledRegionDetermination(fillMode);

            var pointIndex        = 0;
            var arcAngleIndex     = 0;
            var arcClockwiseIndex = 0;
            var figureOpen        = false;
            var segmentIndex      = -1;

            var lastOperation = PathOperation.Move;

            foreach (var type in path.SegmentTypes)
            {
                segmentIndex++;

                if (type == PathOperation.Move)
                {
                    if (lastOperation != PathOperation.Close && lastOperation != PathOperation.Move)
                    {
                        builder.EndFigure(CanvasFigureLoop.Open);
                    }

                    var point = path[pointIndex++];
                    var begin = CanvasFigureFill.Default;
                    builder.BeginFigure(ox + point.X * fx, oy + point.Y * fy, begin);
                    figureOpen = true;
                }
                else if (type == PathOperation.Line)
                {
                    var point = path[pointIndex++];
                    builder.AddLine(ox + point.X * fx, oy + point.Y * fy);
                }

                else if (type == PathOperation.Quad)
                {
                    var controlPoint = path[pointIndex++];
                    var endPoint     = path[pointIndex++];

                    builder.AddQuadraticBezier(
                        new Vector2(ox + controlPoint.X * fx, oy + controlPoint.Y * fy),
                        new Vector2(ox + endPoint.X * fx, oy + endPoint.Y * fy));
                }
                else if (type == PathOperation.Cubic)
                {
                    var controlPoint1 = path[pointIndex++];
                    var controlPoint2 = path[pointIndex++];
                    var endPoint      = path[pointIndex++];
                    builder.AddCubicBezier(
                        new Vector2(ox + controlPoint1.X * fx, oy + controlPoint1.Y * fy),
                        new Vector2(ox + controlPoint2.X * fx, oy + controlPoint2.Y * fy),
                        new Vector2(ox + endPoint.X * fx, oy + endPoint.Y * fy));
                }
                else if (type == PathOperation.Arc)
                {
                    var topLeft     = path[pointIndex++];
                    var bottomRight = path[pointIndex++];
                    var startAngle  = path.GetArcAngle(arcAngleIndex++);
                    var endAngle    = path.GetArcAngle(arcAngleIndex++);
                    var clockwise   = path.GetArcClockwise(arcClockwiseIndex++);

                    while (startAngle < 0)
                    {
                        startAngle += 360;
                    }

                    while (endAngle < 0)
                    {
                        endAngle += 360;
                    }

                    var rotation    = Geometry.GetSweep(startAngle, endAngle, clockwise);
                    var absRotation = Math.Abs(rotation);

                    var rectX      = ox + topLeft.X * fx;
                    var rectY      = oy + topLeft.Y * fy;
                    var rectWidth  = (ox + bottomRight.X * fx) - rectX;
                    var rectHeight = (oy + bottomRight.Y * fy) - rectY;

                    var startPoint = Geometry.EllipseAngleToPoint(rectX, rectY, rectWidth, rectHeight, -startAngle);
                    var endPoint   = Geometry.EllipseAngleToPoint(rectX, rectY, rectWidth, rectHeight, -endAngle);


                    if (!figureOpen)
                    {
                        var begin = CanvasFigureFill.Default;
                        builder.BeginFigure(startPoint.X, startPoint.Y, begin);
                        figureOpen = true;
                    }
                    else
                    {
                        builder.AddLine(startPoint.X, startPoint.Y);
                    }

                    builder.AddArc(
                        new Vector2(endPoint.X, endPoint.Y),
                        rectWidth / 2,
                        rectHeight / 2,
                        0,
                        clockwise ? CanvasSweepDirection.Clockwise : CanvasSweepDirection.CounterClockwise,
                        absRotation >= 180 ? CanvasArcSize.Large : CanvasArcSize.Small
                        );
                }
                else if (type == PathOperation.Close)
                {
                    builder.EndFigure(CanvasFigureLoop.Closed);
                }

                lastOperation = type;
            }

            if (segmentIndex >= 0 && lastOperation != PathOperation.Close)
            {
                builder.EndFigure(CanvasFigureLoop.Open);
            }

            var geometry = CanvasGeometry.CreatePath(builder);
            return(geometry);

#if DEBUG
        }

        catch (Exception exc)
        {
            builder.Dispose();

            var definition = path.ToDefinitionString();
            Logger.Debug(string.Format("Unable to convert the path to a Win2D Path: {0}", definition), exc);
            return(null);
        }
#endif
        }
Пример #10
0
 public void Dispose()
 {
     mBuilder?.Dispose();
 }