public override void RenderPage(XGraphics gfx) { base.RenderPage(gfx); DrawGridlines(gfx); // Create a new graphical path XGraphicsPath path = new XGraphicsPath(); XSize size = new XSize(90, 140); double rotationAngle = 130; path.AddArc(new XPoint(100, 100), new XPoint(200, 200), size, rotationAngle, false, System.Windows.Media.SweepDirection.Clockwise); path.StartFigure(); path.AddArc(new XPoint(400, 100), new XPoint(500, 200), size, rotationAngle, false, System.Windows.Media.SweepDirection.Counterclockwise); path.StartFigure(); path.AddArc(new XPoint(100, 300), new XPoint(200, 400), size, rotationAngle, true, System.Windows.Media.SweepDirection.Clockwise); path.StartFigure(); path.AddArc(new XPoint(400, 300), new XPoint(500, 400), size, rotationAngle, true, System.Windows.Media.SweepDirection.Counterclockwise); path.StartFigure(); #if DEBUG_ gfx.WriteComment("PathArcSegment"); #endif gfx.DrawPath(XPens.Red, path); }
public override void LineTo(double x, double y) { var point = new XPoint(x, y); CurrentPath.StartFigure(); CurrentPath.AddLine(CurrentPathPoint, point); CurrentPath.CloseFigure(); CurrentPathPoint = point; }
public static XGraphicsPath GetPath(PathEx pathEx) { var path = new XGraphicsPath(); path.FillMode = (XFillMode)Enum.Parse(typeof(XFillMode), pathEx.FillMode.ToString()); path.StartFigure(); var start = new XPoint(); foreach (var segment in pathEx.Segments) { switch (segment.Type) { case PathEx.SegmentType.MoveTo: start = PdfConverter.Convert(segment.Point1.ToPoint()); break; case PathEx.SegmentType.LineTo: var end = PdfConverter.Convert(segment.Point1.ToPoint()); path.AddLine(start, end); start = end; break; case PathEx.SegmentType.BezierTo: var p1 = PdfConverter.Convert(segment.Point1.ToPoint()); var p2 = PdfConverter.Convert(segment.Point2.ToPoint()); var bEnd = PdfConverter.Convert(segment.Point3.ToPoint()); path.AddBezier(start, p1, p2, bEnd); start = bEnd; break; case PathEx.SegmentType.FigureEnd: if (segment.Closed) { path.CloseFigure(); } break; } } return(path); }
internal static void SvgPath2Pdf(SvgPath element, XGraphics graphics) { if (element.Display == "none") { return; } var path = new XGraphicsPath { FillMode = XFillMode.Winding }; foreach (var segment in element.PathData) { switch (segment) { case SvgMoveToSegment svgMoveToSegment: Console.WriteLine($"{segment.GetType()}, start: {svgMoveToSegment.Start}, end: {svgMoveToSegment.End}"); path.StartFigure(); break; case SvgCubicCurveSegment svgCubicCurveSegment: Console.WriteLine( $"{segment.GetType()}, start: {svgCubicCurveSegment.Start}, first control: {svgCubicCurveSegment.FirstControlPoint}, second control: {svgCubicCurveSegment.SecondControlPoint}, end: {svgCubicCurveSegment.End}"); path.AddBezier(ConvertHelper.Point2XPoint(svgCubicCurveSegment.Start), ConvertHelper.Point2XPoint(svgCubicCurveSegment.FirstControlPoint), ConvertHelper.Point2XPoint(svgCubicCurveSegment.SecondControlPoint), ConvertHelper.Point2XPoint(svgCubicCurveSegment.End)); break; case SvgQuadraticCurveSegment svgQuadraticCurveSegment: Console.WriteLine($"{segment.GetType()}, start: {svgQuadraticCurveSegment.Start}, control: {svgQuadraticCurveSegment.ControlPoint}, end: {svgQuadraticCurveSegment.End}"); var(start, control1, control2, end) = MathHelper.Quadratic2Cubic(svgQuadraticCurveSegment.Start, svgQuadraticCurveSegment.ControlPoint, svgQuadraticCurveSegment.End); path.AddBezier(ConvertHelper.Point2XPoint(start), ConvertHelper.Point2XPoint(control1), ConvertHelper.Point2XPoint(control2), ConvertHelper.Point2XPoint(end)); break; case SvgLineSegment svgLineSegment: Console.WriteLine($"{segment.GetType()}, start: {svgLineSegment.Start}, end: {svgLineSegment.End}"); path.AddLine(ConvertHelper.Point2XPoint(svgLineSegment.Start), ConvertHelper.Point2XPoint(svgLineSegment.End)); break; case SvgClosePathSegment svgClosePathSegment: Console.WriteLine($"{segment.GetType()}, start: {svgClosePathSegment.Start}, end: {svgClosePathSegment.End}"); path.CloseFigure(); break; default: Console.WriteLine(segment.GetType()); break; } } if (element.Fill != SvgPaintServer.None) { var brush = ConvertHelper.Fill2XBrush(element.Fill); graphics.DrawPath(brush, path); } if (element.Stroke != null) { var pen = ConvertHelper.Stroke2XPen(element.Stroke, element.StrokeWidth, element.StrokeLineCap, element.StrokeLineJoin); graphics.DrawPath(pen, path); } }
/// <summary> /// /// </summary> /// <param name="pg"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <param name="scale"></param> /// <returns></returns> public static XGraphicsPath ToXGraphicsPath(this Test2d.XPathGeometry pg, double dx, double dy, Func <double, double> scale) { var gp = new XGraphicsPath(); gp.FillMode = pg.FillRule == Test2d.XFillRule.EvenOdd ? XFillMode.Alternate : XFillMode.Winding; foreach (var pf in pg.Figures) { var startPoint = pf.StartPoint; foreach (var segment in pf.Segments) { if (segment is Test2d.XArcSegment) { #if CORE //var arcSegment = segment as Test2d.XArcSegment; // TODO: Convert WPF/SVG elliptical arc segment format to GDI+ bezier curves. //startPoint = arcSegment.Point; #endif #if WPF var arcSegment = segment as Test2d.XArcSegment; var point1 = new XPoint( scale(startPoint.X), scale(startPoint.Y)); var point2 = new XPoint( scale(arcSegment.Point.X), scale(arcSegment.Point.Y)); var size = new XSize( scale(arcSegment.Size.Width), scale(arcSegment.Size.Height)); gp.AddArc( point1, point2, size, arcSegment.RotationAngle, arcSegment.IsLargeArc, arcSegment.SweepDirection == Test2d.XSweepDirection.Clockwise ? XSweepDirection.Clockwise : XSweepDirection.Counterclockwise); startPoint = arcSegment.Point; #endif } else if (segment is Test2d.XBezierSegment) { var bezierSegment = segment as Test2d.XBezierSegment; gp.AddBezier( scale(startPoint.X), scale(startPoint.Y), scale(bezierSegment.Point1.X), scale(bezierSegment.Point1.Y), scale(bezierSegment.Point2.X), scale(bezierSegment.Point2.Y), scale(bezierSegment.Point3.X), scale(bezierSegment.Point3.Y)); startPoint = bezierSegment.Point3; } else if (segment is Test2d.XLineSegment) { var lineSegment = segment as Test2d.XLineSegment; gp.AddLine( scale(startPoint.X), scale(startPoint.Y), scale(lineSegment.Point.X), scale(lineSegment.Point.Y)); startPoint = lineSegment.Point; } else if (segment is Test2d.XPolyBezierSegment) { var polyBezierSegment = segment as Test2d.XPolyBezierSegment; if (polyBezierSegment.Points.Count >= 3) { gp.AddBezier( scale(startPoint.X), scale(startPoint.Y), scale(polyBezierSegment.Points[0].X), scale(polyBezierSegment.Points[0].Y), scale(polyBezierSegment.Points[1].X), scale(polyBezierSegment.Points[1].Y), scale(polyBezierSegment.Points[2].X), scale(polyBezierSegment.Points[2].Y)); } if (polyBezierSegment.Points.Count > 3 && polyBezierSegment.Points.Count % 3 == 0) { for (int i = 3; i < polyBezierSegment.Points.Count; i += 3) { gp.AddBezier( scale(polyBezierSegment.Points[i - 1].X), scale(polyBezierSegment.Points[i - 1].Y), scale(polyBezierSegment.Points[i].X), scale(polyBezierSegment.Points[i].Y), scale(polyBezierSegment.Points[i + 1].X), scale(polyBezierSegment.Points[i + 1].Y), scale(polyBezierSegment.Points[i + 2].X), scale(polyBezierSegment.Points[i + 2].Y)); } } startPoint = polyBezierSegment.Points.Last(); } else if (segment is Test2d.XPolyLineSegment) { var polyLineSegment = segment as Test2d.XPolyLineSegment; if (polyLineSegment.Points.Count >= 1) { gp.AddLine( scale(startPoint.X), scale(startPoint.Y), scale(polyLineSegment.Points[0].X), scale(polyLineSegment.Points[0].Y)); } if (polyLineSegment.Points.Count > 1) { for (int i = 1; i < polyLineSegment.Points.Count; i++) { gp.AddLine( scale(polyLineSegment.Points[i - 1].X), scale(polyLineSegment.Points[i - 1].Y), scale(polyLineSegment.Points[i].X), scale(polyLineSegment.Points[i].Y)); } } startPoint = polyLineSegment.Points.Last(); } else if (segment is Test2d.XPolyQuadraticBezierSegment) { var polyQuadraticSegment = segment as Test2d.XPolyQuadraticBezierSegment; if (polyQuadraticSegment.Points.Count >= 2) { var p1 = startPoint; var p2 = polyQuadraticSegment.Points[0]; var p3 = polyQuadraticSegment.Points[1]; double x1 = p1.X; double y1 = p1.Y; double x2 = p1.X + (2.0 * (p2.X - p1.X)) / 3.0; double y2 = p1.Y + (2.0 * (p2.Y - p1.Y)) / 3.0; double x3 = x2 + (p3.X - p1.X) / 3.0; double y3 = y2 + (p3.Y - p1.Y) / 3.0; double x4 = p3.X; double y4 = p3.Y; gp.AddBezier( scale(x1 + dx), scale(y1 + dy), scale(x2 + dx), scale(y2 + dy), scale(x3 + dx), scale(y3 + dy), scale(x4 + dx), scale(y4 + dy)); } if (polyQuadraticSegment.Points.Count > 2 && polyQuadraticSegment.Points.Count % 2 == 0) { for (int i = 3; i < polyQuadraticSegment.Points.Count; i += 3) { var p1 = polyQuadraticSegment.Points[i - 1]; var p2 = polyQuadraticSegment.Points[i]; var p3 = polyQuadraticSegment.Points[i + 1]; double x1 = p1.X; double y1 = p1.Y; double x2 = p1.X + (2.0 * (p2.X - p1.X)) / 3.0; double y2 = p1.Y + (2.0 * (p2.Y - p1.Y)) / 3.0; double x3 = x2 + (p3.X - p1.X) / 3.0; double y3 = y2 + (p3.Y - p1.Y) / 3.0; double x4 = p3.X; double y4 = p3.Y; gp.AddBezier( scale(x1 + dx), scale(y1 + dy), scale(x2 + dx), scale(y2 + dy), scale(x3 + dx), scale(y3 + dy), scale(x4 + dx), scale(y4 + dy)); } } startPoint = polyQuadraticSegment.Points.Last(); } else if (segment is Test2d.XQuadraticBezierSegment) { var qbezierSegment = segment as Test2d.XQuadraticBezierSegment; var p1 = startPoint; var p2 = qbezierSegment.Point1; var p3 = qbezierSegment.Point2; double x1 = p1.X; double y1 = p1.Y; double x2 = p1.X + (2.0 * (p2.X - p1.X)) / 3.0; double y2 = p1.Y + (2.0 * (p2.Y - p1.Y)) / 3.0; double x3 = x2 + (p3.X - p1.X) / 3.0; double y3 = y2 + (p3.Y - p1.Y) / 3.0; double x4 = p3.X; double y4 = p3.Y; gp.AddBezier( scale(x1 + dx), scale(y1 + dy), scale(x2 + dx), scale(y2 + dy), scale(x3 + dx), scale(y3 + dy), scale(x4 + dx), scale(y4 + dy)); startPoint = qbezierSegment.Point2; } else { throw new NotSupportedException("Not supported segment type: " + segment.GetType()); } } if (pf.IsClosed) { gp.CloseFigure(); } else { gp.StartFigure(); } } return(gp); }
public void StartFigure() { Path.StartFigure(); }