Пример #1
0
        public void Visit(ISvgPathElement element)
        {
            SvgPathElement pe = element as SvgPathElement;

            if (pe == null || string.IsNullOrEmpty(pe.PathScript))
            {
                return;
            }

            var geometry = new PathGeometry();

            FillRule fillRule;

            if (TryGetFillRule(pe, out fillRule))
            {
                geometry.FillRule = fillRule;
            }

            try
            {
                geometry.Figures = PathFigureCollection.Parse(pe.PathScript);
            }
            catch
            {
                return;
            }

            var shape = WrapGeometry(geometry, element);

            DisplayShape(shape, element);
        }
Пример #2
0
        public Geometry CreateGeometryEx(SvgPathElement element)
        {
            PathGeometry geometry = new PathGeometry();

            string pathScript = element.PathScript;

            if (string.IsNullOrWhiteSpace(pathScript))
            {
                return(geometry);
            }

            var    comparer = StringComparison.OrdinalIgnoreCase;
            string fillRule = element.GetPropertyValue("fill-rule");
            string clipRule = element.GetAttribute("clip-rule");

            if (!string.IsNullOrWhiteSpace(clipRule) && string.Equals(clipRule, "evenodd", comparer) ||
                string.Equals(clipRule, CssConstants.ValNonzero, comparer))
            {
                fillRule = clipRule;
            }
            if (string.Equals(fillRule, "evenodd", comparer))
            {
                geometry.FillRule = FillRule.EvenOdd;
            }
            else if (string.Equals(fillRule, CssConstants.ValNonzero, comparer))
            {
                geometry.FillRule = FillRule.Nonzero;
            }

            try
            {
                geometry.Figures = PathFigureCollection.Parse(pathScript);

                if (_flattenClosedPath && element.IsClosed &&
                    geometry.MayHaveCurves() == element.MayHaveCurves)
                {
                    int closedCount = 0;
                    foreach (var figure in geometry.Figures)
                    {
                        if (figure.IsClosed)
                        {
                            closedCount++;
                        }
                    }

                    if (geometry.Figures.Count == closedCount)
                    {
                        return(geometry.GetFlattenedPathGeometry(_flattenTolerance, _flattenToleranceType));
                    }
                }

                return(geometry);
            }
            catch (FormatException ex)
            {
                Trace.TraceError(ex.GetType().Name + ": " + ex.Message);
                //return null;
                return(CreateGeometry(element));
            }
        }
        public Geometry CreateGeometryEx(SvgPathElement element)
        {
            PathGeometry geometry = new PathGeometry();

            string pathScript = element.PathScript;

            if (string.IsNullOrWhiteSpace(pathScript))
            {
                return(geometry);
            }

            string fillRule = element.GetPropertyValue("fill-rule");
            string clipRule = element.GetAttribute("clip-rule");

            if (!string.IsNullOrWhiteSpace(clipRule) &&
                string.Equals(clipRule, "evenodd") || string.Equals(clipRule, "nonzero"))
            {
                fillRule = clipRule;
            }
            if (fillRule == "evenodd")
            {
                geometry.FillRule = FillRule.EvenOdd;
            }
            else if (fillRule == "nonzero")
            {
                geometry.FillRule = FillRule.Nonzero;
            }

            try
            {
                geometry.Figures = PathFigureCollection.Parse(pathScript);

                if (_flattenClosedPath && element.IsClosed &&
                    geometry.MayHaveCurves() == element.MayHaveCurves)
                {
                    int closedCount = 0;
                    foreach (var figure in geometry.Figures)
                    {
                        if (figure.IsClosed)
                        {
                            closedCount++;
                        }
                    }

                    if (geometry.Figures.Count == closedCount)
                    {
                        return(geometry.GetFlattenedPathGeometry(_flattenTolerance, _flattenToleranceType));
                    }
                }

                return(geometry);
            }
            catch
            {
                return(CreateGeometry(element));
            }
        }
Пример #4
0
        internal void Build(Wheel wheel, SvgSvgElement root)
        {
            SvgGroupElement helperLinesGroup = new SvgGroupElement("HelperLines");

            helperLinesGroup.Style = Styles.HelperLineStyle;
            root.AddChild(helperLinesGroup);

            // Wheel pitch circle
            helperLinesGroup.AddChild(SvgHelper.CreateCircle(wheel.Center, wheel.PitchDiameter / 2.0));

            // Wheel addendum circle
            helperLinesGroup.AddChild(SvgHelper.CreateCircle(wheel.Center, wheel.PitchDiameter / 2.0 + wheel.Addendum));

            // Wheel dedendum circle
            helperLinesGroup.AddChild(SvgHelper.CreateCircle(wheel.Center, wheel.PitchDiameter / 2.0 - wheel.Dedendum));

            // wheel center
            double halfCrossLength = 10;

            helperLinesGroup.AddChild(new SvgLineElement(wheel.Center.X - halfCrossLength, wheel.Center.Y, wheel.Center.X + halfCrossLength, wheel.Center.Y));
            helperLinesGroup.AddChild(new SvgLineElement(wheel.Center.X, wheel.Center.Y - halfCrossLength, wheel.Center.X, wheel.Center.Y + halfCrossLength));


            SvgGroupElement mainGroup = new SvgGroupElement("Main");

            mainGroup.Style = Styles.MinorLineStyle;
            root.AddChild(mainGroup);


            WheelTooth[]  teeth       = wheel.GetTeeth(0);
            StringBuilder pathBuilder = new StringBuilder();

            pathBuilder.AppendFormat(CultureInfo.InvariantCulture, "M{0},{1}", (float)teeth[0].DedendumIntersectLeft.X, (float)teeth[0].DedendumIntersectLeft.Y);
            for (int i = 0; i < teeth.Length; i++)
            {
                WheelTooth tooth     = teeth[i];
                WheelTooth nextTooth = teeth[(i + 1) % teeth.Length];
                InsertWheelToothPath(wheel, tooth, nextTooth, pathBuilder);
            }
            pathBuilder.Append(" z");

            SvgPath        svgPath        = new SvgPath(pathBuilder.ToString());
            SvgPathElement svgPathElement = new SvgPathElement();

            svgPathElement.D = svgPath;

            mainGroup.AddChild(svgPathElement);

            if (wheel.CenterHoleDiameter > 0)
            {
                mainGroup.AddChild(SvgHelper.CreateCircle(wheel.Center, wheel.CenterHoleDiameter / 2.0));
            }
        }
Пример #5
0
        private void AddSlice(SvgGroupElement group, double radius, double angle, double angularWidth)
        {
            PointF firstPointOnCircle  = GetPointOnCircle(radius, angle - angularWidth / 2.0);
            PointF secondPointOnCircle = GetPointOnCircle(radius, angle + angularWidth / 2.0);

            // for an explanation of the arc syntax see: http://www.codestore.net/store.nsf/unid/EPSD-5DTT4L
            string path = String.Format(
                CultureInfo.InvariantCulture,
                "M0,0 L{0},{1} A{2},{2} 0 0,1 {3},{4} z",
                firstPointOnCircle.X, firstPointOnCircle.Y, (float)radius, secondPointOnCircle.X, secondPointOnCircle.Y);

            SvgPath        svgPath        = new SvgPath(path);
            SvgPathElement svgPathElement = new SvgPathElement();

            svgPathElement.D = svgPath;
            group.AddChild(svgPathElement);
        }
 public override SvgPathSegList VisitPathElement(SvgPathElement element)
 => element.Segments;
Пример #7
0
 public virtual void VisitPathElement(SvgPathElement element)
 => DefaultVisit(element);
Пример #8
0
        public Geometry CreateGeometry(SvgPathElement element)
        {
            PathGeometry geometry = new PathGeometry();

            var    comparer = StringComparison.OrdinalIgnoreCase;
            string fillRule = element.GetPropertyValue("fill-rule");
            string clipRule = element.GetAttribute("clip-rule");

            if (!string.IsNullOrWhiteSpace(clipRule) && string.Equals(clipRule, "evenodd", comparer) ||
                string.Equals(clipRule, CssConstants.ValNonzero, comparer))
            {
                fillRule = clipRule;
            }
            if (string.Equals(fillRule, "evenodd", comparer))
            {
                geometry.FillRule = FillRule.EvenOdd;
            }
            else if (string.Equals(fillRule, CssConstants.ValNonzero, comparer))
            {
                geometry.FillRule = FillRule.Nonzero;
            }

            SvgPointF initPoint = new SvgPointF(0, 0);
            SvgPointF lastPoint = new SvgPointF(0, 0);
            SvgPointF ptXY      = new SvgPointF(0, 0);

            SvgPathSeg        segment     = null;
            SvgPathSegMoveto  pathMoveTo  = null;
            SvgPathSegLineto  pathLineTo  = null;
            SvgPathSegCurveto pathCurveTo = null;
            SvgPathSegArc     pathArc     = null;

            SvgPathSegList segments = element.PathSegList;
            int            numSegs  = segments.NumberOfItems;

            if (numSegs == 0)
            {
                return(geometry);
            }

            PathFigure pathFigure = null;

            for (int i = 0; i < numSegs; i++)
            {
                segment = segments.GetItem(i);

                switch (segment.PathType)
                {
                case SvgPathType.MoveTo:     //if (DynamicCast.Cast(segment, out pathMoveTo))
                    pathMoveTo = (SvgPathSegMoveto)segment;
                    if (pathFigure != null)
                    {
                        pathFigure.IsClosed = false;
                        pathFigure.IsFilled = true;
                        geometry.Figures.Add(pathFigure);
                        pathFigure = null;
                    }

                    lastPoint = initPoint = pathMoveTo.AbsXY;

                    pathFigure            = new PathFigure();
                    pathFigure.StartPoint = new Point(initPoint.ValueX, initPoint.ValueY);
                    break;

                case SvgPathType.LineTo:     //else if (DynamicCast.Cast(segment, out pathLineTo))
                    pathLineTo = (SvgPathSegLineto)segment;
                    ptXY       = pathLineTo.AbsXY;
                    pathFigure.Segments.Add(new LineSegment(new Point(ptXY.ValueX, ptXY.ValueY), true));

                    lastPoint = ptXY;
                    break;

                case SvgPathType.CurveTo:     //else if (DynamicCast.Cast(segment, out pathCurveTo))
                    pathCurveTo = (SvgPathSegCurveto)segment;

                    SvgPointF xy   = pathCurveTo.AbsXY;
                    SvgPointF x1y1 = pathCurveTo.CubicX1Y1;
                    SvgPointF x2y2 = pathCurveTo.CubicX2Y2;
                    pathFigure.Segments.Add(new BezierSegment(new Point(x1y1.ValueX, x1y1.ValueY),
                                                              new Point(x2y2.ValueX, x2y2.ValueY), new Point(xy.ValueX, xy.ValueY), true));

                    lastPoint = xy;
                    break;

                case SvgPathType.ArcTo:     //else if (DynamicCast.Cast(segment, out pathArc))
                    pathArc = (SvgPathSegArc)segment;
                    ptXY    = pathArc.AbsXY;
                    if (lastPoint.Equals(ptXY))
                    {
                        // If the endpoints (x, y) and (x0, y0) are identical, then this
                        // is equivalent to omitting the elliptical arc segment entirely.
                    }
                    else if (pathArc.R1.Equals(0) || pathArc.R2.Equals(0))
                    {
                        // Ensure radii are valid
                        pathFigure.Segments.Add(new LineSegment(new Point(ptXY.ValueX, ptXY.ValueY), true));
                    }
                    else
                    {
                        CalculatedArcValues calcValues = pathArc.GetCalculatedArcValues();

                        pathFigure.Segments.Add(new ArcSegment(new Point(ptXY.ValueX, ptXY.ValueY),
                                                               new Size(pathArc.R1, pathArc.R2), pathArc.Angle, pathArc.LargeArcFlag,
                                                               pathArc.SweepFlag ? SweepDirection.Clockwise : SweepDirection.Counterclockwise,
                                                               true));
                    }

                    lastPoint = ptXY;
                    break;

                case SvgPathType.Close:    //else if (segment is SvgPathSegClosePath)
                    if (pathFigure != null)
                    {
                        pathFigure.IsClosed = true;
                        pathFigure.IsFilled = true;
                        geometry.Figures.Add(pathFigure);
                        pathFigure = null;
                    }

                    lastPoint = initPoint;
                    break;
                }
            }

            if (pathFigure != null)
            {
                pathFigure.IsClosed = false;
                pathFigure.IsFilled = true;
                geometry.Figures.Add(pathFigure);
            }

            return(geometry);
        }
        public static GraphicsPath CreatePath(SvgPathElement element)
        {
            GraphicsPath gp = new GraphicsPath();

            SvgPointF initPoint = new SvgPointF(0, 0);
            SvgPointF lastPoint = new SvgPointF(0, 0);

            SvgPointF ptXY = new SvgPointF(0, 0);

            SvgPathSeg        segment     = null;
            SvgPathSegMoveto  pathMoveTo  = null;
            SvgPathSegLineto  pathLineTo  = null;
            SvgPathSegCurveto pathCurveTo = null;
            SvgPathSegArc     pathArc     = null;

            SvgPathSegList segments = element.PathSegList;
            int            nElems   = segments.NumberOfItems;

            for (int i = 0; i < nElems; i++)
            {
                segment = segments.GetItem(i);
                switch (segment.PathType)
                {
                case SvgPathType.MoveTo:     //if (DynamicCast.Cast(segment, out pathMoveTo))
                    pathMoveTo = (SvgPathSegMoveto)segment;
                    gp.StartFigure();
                    lastPoint = initPoint = pathMoveTo.AbsXY;
                    break;

                case SvgPathType.LineTo:     //else if (DynamicCast.Cast(segment, out pathLineTo))
                    pathLineTo = (SvgPathSegLineto)segment;
                    ptXY       = pathLineTo.AbsXY;
                    gp.AddLine(lastPoint.X, lastPoint.Y, ptXY.X, ptXY.Y);

                    lastPoint = ptXY;
                    break;

                case SvgPathType.CurveTo:     //else if (DynamicCast.Cast(segment, out pathCurveTo))
                    pathCurveTo = (SvgPathSegCurveto)segment;

                    SvgPointF xy   = pathCurveTo.AbsXY;
                    SvgPointF x1y1 = pathCurveTo.CubicX1Y1;
                    SvgPointF x2y2 = pathCurveTo.CubicX2Y2;
                    gp.AddBezier(lastPoint.X, lastPoint.Y, x1y1.X, x1y1.Y, x2y2.X, x2y2.Y, xy.X, xy.Y);

                    lastPoint = xy;
                    break;

                case SvgPathType.ArcTo:     //else if (DynamicCast.Cast(segment, out pathArc))
                    pathArc = (SvgPathSegArc)segment;
                    ptXY    = pathArc.AbsXY;
                    if (lastPoint.Equals(ptXY))
                    {
                        // If the endpoints (x, y) and (x0, y0) are identical, then this
                        // is equivalent to omitting the elliptical arc segment entirely.
                    }
                    else if (pathArc.R1.Equals(0) || pathArc.R2.Equals(0))
                    {
                        // Ensure radii are valid
                        gp.AddLine(lastPoint.X, lastPoint.Y, ptXY.X, ptXY.Y);
                    }
                    else
                    {
                        CalculatedArcValues calcValues = pathArc.GetCalculatedArcValues();

                        GraphicsPath subPath = new GraphicsPath();
                        subPath.StartFigure();
                        subPath.AddArc((float)(calcValues.Cx - calcValues.CorrRx),
                                       (float)(calcValues.Cy - calcValues.CorrRy),
                                       (float)calcValues.CorrRx * 2, (float)calcValues.CorrRy * 2,
                                       (float)calcValues.AngleStart, (float)calcValues.AngleExtent);

                        Matrix matrix = new Matrix();
                        matrix.Translate(-(float)calcValues.Cx, -(float)calcValues.Cy);
                        subPath.Transform(matrix);

                        matrix = new Matrix();
                        matrix.Rotate((float)pathArc.Angle);
                        subPath.Transform(matrix);

                        matrix = new Matrix();
                        matrix.Translate((float)calcValues.Cx, (float)calcValues.Cy);
                        subPath.Transform(matrix);

                        gp.AddPath(subPath, true);
                    }

                    lastPoint = ptXY;
                    break;

                case SvgPathType.Close:    //else if (segment is SvgPathSegClosePath)
                    gp.CloseFigure();

                    lastPoint = initPoint;
                    break;
                }
            }

            string fillRule = element.GetPropertyValue("fill-rule");

            if (fillRule == "evenodd")
            {
                gp.FillMode = FillMode.Alternate;
            }
            else
            {
                gp.FillMode = FillMode.Winding;
            }

            return(gp);
        }
Пример #10
0
        private CanvasGeometry CreatePath(CanvasDrawingSession session, SvgPathElement element)
        {
            if (this.PathCache.ContainsKey(element))
            {
                return(this.PathCache[element]);
            }

            var open = false;
            var v    = new Vector2 {
                X = 0.0F, Y = 0.0F
            };

            CanvasGeometry geometry;

            using (var builder = new CanvasPathBuilder(this.ResourceCreator))
            {
                var fillRule = element.Style.FillRule;
                if (fillRule.HasValue && fillRule.Value.Value != SvgFillRuleType.EvenOdd)
                {
                    builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding);
                }
                foreach (var segment in element.Segments)
                {
                    if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.ClosePath)
                    {
                        builder.EndFigure(CanvasFigureLoop.Closed);
                        open = false;
                        continue;
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.MoveToAbsolute)
                    {
                        if (open)
                        {
                            builder.EndFigure(CanvasFigureLoop.Open);
                        }

                        var casted = (SvgPathSegmentMoveToAbsolute)segment;
                        v.X = casted.X;
                        v.Y = casted.Y;
                        builder.BeginFigure(v);
                        open = true;
                        continue;
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.MoveToRelative)
                    {
                        if (open)
                        {
                            builder.EndFigure(CanvasFigureLoop.Open);
                        }

                        var casted = (SvgPathSegmentMoveToRelative)segment;
                        v.X += casted.X;
                        v.Y += casted.Y;
                        builder.BeginFigure(v);
                        open = true;
                        continue;
                    }

                    if (!open)
                    {
                        builder.BeginFigure(v);
                        open = true;
                    }
                    if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.LineToAbsolute)
                    {
                        var casted = (SvgPathSegmentLineToAbsolute)segment;
                        v.X = casted.X;
                        v.Y = casted.Y;
                        builder.AddLine(v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.LineToRelative)
                    {
                        var casted = (SvgPathSegmentLineToRelative)segment;
                        v.X += casted.X;
                        v.Y += casted.Y;
                        builder.AddLine(v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.CurveToCubicAbsolute)
                    {
                        var casted = (SvgPathSegmentCurveToCubicAbsolute)segment;
                        v.X = casted.X;
                        v.Y = casted.Y;
                        builder.AddCubicBezier(new Vector2 {
                            X = casted.X1, Y = casted.Y1
                        }, new Vector2 {
                            X = casted.X2, Y = casted.Y2
                        }, v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.CurveToCubicRelative)
                    {
                        var casted = (SvgPathSegmentCurveToCubicRelative)segment;
                        var c1     = v;
                        c1.X += casted.X1;
                        c1.Y += casted.Y1;
                        var c2 = v;
                        c2.X += casted.X2;
                        c2.Y += casted.Y2;
                        v.X  += casted.X;
                        v.Y  += casted.Y;
                        builder.AddCubicBezier(c1, c2, v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.CurveToQuadraticAbsolute)
                    {
                        var casted = (SvgPathSegmentCurveToQuadraticAbsolute)segment;
                        v.X = casted.X;
                        v.Y = casted.Y;
                        builder.AddQuadraticBezier(new Vector2 {
                            X = casted.X1, Y = casted.Y1
                        }, v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.CurveToQuadraticRelative)
                    {
                        var casted = (SvgPathSegmentCurveToQuadraticRelative)segment;
                        var c1     = v;
                        c1.X += casted.X1;
                        c1.Y += casted.Y1;
                        v.X  += casted.X;
                        v.Y  += casted.Y;
                        builder.AddQuadraticBezier(c1, v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.ArcAbsolute)
                    {
                        var casted         = (SvgPathSegmentArcAbsolute)segment;
                        var size           = casted.LargeArcFlag ? CanvasArcSize.Large : CanvasArcSize.Small;
                        var sweepDirection = casted.SweepFlag ? CanvasSweepDirection.Clockwise : CanvasSweepDirection.CounterClockwise;
                        builder.AddArc(new Vector2 {
                            X = casted.X, Y = casted.Y
                        }, casted.RadiusX, casted.RadiusY, 180.0F * casted.Angle / (float)Math.PI, sweepDirection, size);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.ArcRelative)
                    {
                        var casted = (SvgPathSegmentArcRelative)segment;
                        v.X += casted.X;
                        v.Y += casted.Y;
                        var size           = casted.LargeArcFlag ? CanvasArcSize.Large : CanvasArcSize.Small;
                        var sweepDirection = casted.SweepFlag ? CanvasSweepDirection.Clockwise : CanvasSweepDirection.CounterClockwise;
                        builder.AddArc(v, casted.RadiusX, casted.RadiusY, 180.0F * casted.Angle / (float)Math.PI, sweepDirection, size);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.LineToHorizontalAbsolute)
                    {
                        var casted = (SvgPathSegmentLineToHorizontalAbsolute)segment;
                        v.X = casted.X;
                        builder.AddLine(v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.LineToHorizontalRelative)
                    {
                        var casted = (SvgPathSegmentLineToHorizontalRelative)segment;
                        v.X += casted.X;
                        builder.AddLine(v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.LineToVerticalAbsolute)
                    {
                        var casted = (SvgPathSegmentLineToVerticalAbsolute)segment;
                        v.Y = casted.Y;
                        builder.AddLine(v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.LineToVerticalRelative)
                    {
                        var casted = (SvgPathSegmentLineToVerticalRelative)segment;
                        v.Y += casted.Y;
                        builder.AddLine(v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.CurveToCubicSmoothAbsolute)
                    {
                        var casted = (SvgPathSegmentCurveToCubicSmoothAbsolute)segment;
                        var c1     = v;
                        v.X = casted.X;
                        v.Y = casted.Y;
                        builder.AddCubicBezier(c1, new Vector2 {
                            X = casted.X2, Y = casted.Y2
                        }, v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.CurveToCubicSmoothRelative)
                    {
                        var casted = (SvgPathSegmentCurveToCubicSmoothRelative)segment;
                        var c1     = v;
                        var c2     = v;
                        c2.X += casted.X2;
                        c2.Y += casted.Y2;
                        v.X  += casted.X;
                        v.Y  += casted.Y;
                        builder.AddCubicBezier(c1, c2, v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.CurveToQuadraticSmoothAbsolute)
                    {
                        var casted = (SvgPathSegmentCurveToQuadraticSmoothAbsolute)segment;
                        var c1     = v;
                        v.X = casted.X;
                        v.Y = casted.Y;
                        builder.AddQuadraticBezier(c1, v);
                    }
                    else if (segment.PathSegmentType == SvgPathSegment.SvgPathSegmentType.CurveToQuadraticSmoothRelative)
                    {
                        var casted = (SvgPathSegmentCurveToQuadraticSmoothRelative)segment;
                        var c1     = v;
                        v.X += casted.X;
                        v.Y += casted.Y;
                        builder.AddQuadraticBezier(c1, v);
                    }
                }
                if (open)
                {
                    builder.EndFigure(CanvasFigureLoop.Open);
                }

                geometry = CanvasGeometry.CreatePath(builder);
            }
            this.DisposableObjects.Add(geometry);
            this.PathCache.Add(element, geometry);
            return(geometry);
        }
Пример #11
0
 protected abstract void RenderPath(TSession session, SvgPathElement element);
Пример #12
0
        private void button2_Click(object sender, System.EventArgs e)
        {
            SvgSvgElement root = new SvgSvgElement("4in", "4in", "0,0 100,100");


            //adding multiple children

            root.AddChildren(
                new SvgRectElement(5, 5, 5, 5),
                new SvgEllipseElement(30, 10, 8, 12),
                new SvgTextElement("Textastic!", 3, 20)
                );


            //group and path

            SvgGroupElement grp = new SvgGroupElement("green_group");

            grp.Style = "fill:green;stroke:black;";

            SvgEllipseElement ell = new SvgEllipseElement();

            ell.CX = 50;
            ell.CY = 50;
            ell.RX = 10;
            ell.RY = 20;

            SvgPathElement pathy = new SvgPathElement();

            pathy.D     = "M 20,80 C 20,90 30,80 70,100 C 70,100 40,60 50,60 z";
            pathy.Style = ell.Style;

            root.AddChild(grp);


            //cloning and style arithmetic

            grp.AddChildren(ell, pathy);

            grp.Style.Set("fill", "blue");

            SvgGroupElement grp2 = (SvgGroupElement)SvgFactory.CloneElement(grp);

            grp2.Id = "cloned_red_group";

            grp2.Style.Set("fill", "red");

            grp2.Style += "opacity:0.5";

            grp2.Transform = "scale (1.2, 1.2)  translate(10)";

            root.AddChild(grp2);


            //output

            string s = root.WriteSVGString(true);

            tbOut.Text = s;

            StreamWriter tw = new StreamWriter("c:\\temp\\foo.svg", false);

            tw.Write(s);

            tw.Close();

            svgOut.SRC = "c:\\temp\\foo.svg";
        }
Пример #13
0
        protected override void RenderPath(CanvasDrawingSession session, SvgPathElement element)
        {
            var geometry = this.CreatePath(session, element);             // NO Dispose!

            this.RenderGeometory(session, geometry, element.Transform.Result, element.Style);
        }
Пример #14
0
        private SvgPathSegLinetoAbs getLineto()
        {
            SvgPathElement path = getPathElement();

            return((SvgPathSegLinetoAbs)path.CreateSvgPathSegLinetoAbs(20, 30));
        }
Пример #15
0
        private void button2_Click(object sender, System.EventArgs e)
        {
            SvgSvgElement root = new SvgSvgElement("4in", "4in", "0,0 100,100");

            //adding multiple children

            root.AddChildren(
                new SvgRectElement(5, 5, 5, 5),
                new SvgEllipseElement(30, 10, 8, 12),
                new SvgTextElement("Textastic!", 3, 20)
                );

            //group and path

            SvgGroupElement grp = new SvgGroupElement("green_group")
            {
                Style = "fill:green;stroke:black;"
            };

            SvgEllipseElement ell = new SvgEllipseElement {
                CX = 50,
                CY = 50,
                RX = 10,
                RY = 20
            };

            SvgPathElement pathy = new SvgPathElement {
                D     = "M 20,80 C 20,90 30,80 70,100 C 70,100 40,60 50,60 z",
                Style = ell.Style
            };

            root.AddChild(grp);

            //cloning and style arithmetic

            grp.AddChildren(ell, pathy);

            grp.Style.Set("fill", "blue");

            SvgGroupElement grp2 = (SvgGroupElement)SvgFactory.CloneElement(grp);

            grp2.Id = "cloned_red_group";

            grp2.Style.Set("fill", "red");

            grp2.Style += "opacity:0.5";

            grp2.Transform = "scale (1.2, 1.2)  translate(10)";

            root.AddChild(grp2);

            //output

            string s = root.WriteSVGString(true);

            tbOut.Text = s;

            string tempFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "foo.svg");

            StreamWriter tw = new StreamWriter(tempFile, false);

            tw.Write(s);

            tw.Close();

            svgOut.Navigate(new Uri(tempFile));
            svgOut.Refresh(WebBrowserRefreshOption.Completely);
        }
 public override void VisitPathElement(SvgPathElement element)
 => VisitPathSegList(element, element.Segments);
Пример #17
0
        private void button2_Click(object sender, System.EventArgs e)
        {
            var root = new SvgSvgElement("4in", "4in", "-10,-10 250,250");

            //adding multiple children

            root.AddChildren(
                new SvgRectElement(5, 5, 5, 5),
                new SvgEllipseElement(20, 20, 8, 12)
            {
                Style = "fill:yellow;stroke:red"
            },

                new SvgAElement("https://github.com/managed-commons/SvgNet").AddChildren(
                    new SvgTextElement("Textastic!", 30, 20)
            {
                Style = "fill:midnightblue;stroke:navy;stroke-width:1px;font-size:30px;font-family:Calibri"
            })
                );

            //group and path

            var grp = new SvgGroupElement("green_group")
            {
                Style = "fill:green;stroke:black;"
            };

            grp.AddChild(new SvgRectElement(30, 30, 5, 20));

            var ell = new SvgEllipseElement
            {
                CX = 50,
                CY = 50,
                RX = 10,
                RY = 20
            };

            var pathy = new SvgPathElement
            {
                D     = "M 20,80 C 20,90 30,80 70,100 C 70,100 40,60 50,60 z",
                Style = ell.Style
            };

            root.AddChild(grp);

            //cloning and style arithmetic

            grp.AddChildren(ell, pathy);

            grp.Style.Set("fill", "blue");

            var grp2 = (SvgGroupElement)SvgFactory.CloneElement(grp);

            grp2.Id = "cloned_red_group";

            grp2.Style.Set("fill", "red");

            grp2.Style += "opacity:0.5";

            grp2.Transform = "scale (1.2, 1.2)  translate(10)";

            root.AddChild(grp2);

            //output

            string s = root.WriteSVGString(true);

            tbOut.Text = s;

            string tempFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "foo.svg");

            using (var tw = new StreamWriter(tempFile, false))
                tw.Write(s);

            svgOut.Navigate(new Uri(tempFile));
            svgOut.Refresh(WebBrowserRefreshOption.Completely);
        }
Пример #18
0
 public override void VisitPathElement(SvgPathElement element)
 {
     base.VisitPathElement(element);
     VisitSvgGeometryElement(element);
 }