public static AM.StreamGeometry ToStreamGeometry(PathGeometryViewModel xpg) { var sg = new AM.StreamGeometry(); using (var sgc = sg.Open()) { PointShapeViewModel previous = default; sgc.SetFillRule(xpg.FillRule == FillRule.Nonzero ? AM.FillRule.NonZero : AM.FillRule.EvenOdd); foreach (var xpf in xpg.Figures) { sgc.BeginFigure(new A.Point(xpf.StartPoint.X, xpf.StartPoint.Y), false); previous = xpf.StartPoint; foreach (var segment in xpf.Segments) { if (segment is ArcSegmentViewModel arcSegment) { sgc.ArcTo( new A.Point(arcSegment.Point.X, arcSegment.Point.Y), new A.Size(arcSegment.Size.Width, arcSegment.Size.Height), arcSegment.RotationAngle, arcSegment.IsLargeArc, arcSegment.SweepDirection == SweepDirection.Clockwise ? AM.SweepDirection.Clockwise : AM.SweepDirection.CounterClockwise); previous = arcSegment.Point; } else if (segment is CubicBezierSegmentViewModel cubicBezierSegment) { sgc.CubicBezierTo( new A.Point(cubicBezierSegment.Point1.X, cubicBezierSegment.Point1.Y), new A.Point(cubicBezierSegment.Point2.X, cubicBezierSegment.Point2.Y), new A.Point(cubicBezierSegment.Point3.X, cubicBezierSegment.Point3.Y)); previous = cubicBezierSegment.Point3; } else if (segment is LineSegmentViewModel lineSegment) { sgc.LineTo( new A.Point(lineSegment.Point.X, lineSegment.Point.Y)); previous = lineSegment.Point; } else if (segment is QuadraticBezierSegmentViewModel quadraticBezierSegment) { sgc.QuadraticBezierTo( new A.Point( quadraticBezierSegment.Point1.X, quadraticBezierSegment.Point1.Y), new A.Point( quadraticBezierSegment.Point2.X, quadraticBezierSegment.Point2.Y)); previous = quadraticBezierSegment.Point2; } else { throw new NotSupportedException("Not supported segment type: " + segment.GetType()); } } sgc.EndFigure(xpf.IsClosed); } } return(sg); }
public static string ToSource(PathGeometryViewModel xpg) { return(ToStreamGeometry(xpg).ToString()); }
public static D2D.GraphicsPath ToGraphicsPath(this PathGeometryViewModel pg, Func <double, float> scale) { var gp = new D2D.GraphicsPath { FillMode = pg.FillRule == FillRule.EvenOdd ? D2D.FillMode.Alternate : D2D.FillMode.Winding }; foreach (var pf in pg.Figures) { var startPoint = pf.StartPoint; foreach (var segment in pf.Segments) { if (segment is ArcSegmentViewModel arcSegment) { // TODO: Convert WPF/SVG elliptical arc segment format to GDI+ bezier curves. startPoint = arcSegment.Point; } else if (segment is CubicBezierSegmentViewModel cubicBezierSegment) { gp.AddBezier( scale(startPoint.X), scale(startPoint.Y), scale(cubicBezierSegment.Point1.X), scale(cubicBezierSegment.Point1.Y), scale(cubicBezierSegment.Point2.X), scale(cubicBezierSegment.Point2.Y), scale(cubicBezierSegment.Point3.X), scale(cubicBezierSegment.Point3.Y)); startPoint = cubicBezierSegment.Point3; } else if (segment is LineSegmentViewModel lineSegment) { gp.AddLine( scale(startPoint.X), scale(startPoint.Y), scale(lineSegment.Point.X), scale(lineSegment.Point.Y)); startPoint = lineSegment.Point; } else if (segment is QuadraticBezierSegmentViewModel quadraticBezierSegment) { var p1 = startPoint; var p2 = quadraticBezierSegment.Point1; var p3 = quadraticBezierSegment.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), scale(y1), scale(x2), scale(y2), scale(x3), scale(y3), scale(x4), scale(y4)); startPoint = quadraticBezierSegment.Point2; } else { throw new NotSupportedException("Not supported segment type: " + segment.GetType()); } } if (pf.IsClosed) { gp.CloseFigure(); } else { gp.StartFigure(); } } return(gp); }
public static AM.Geometry ToGeometry(PathGeometryViewModel xpg) { return(ToStreamGeometry(xpg)); }
public static PDF.XGraphicsPath ToXGraphicsPath(this PathGeometryViewModel pg, Func <double, double> scale) { var gp = new PDF.XGraphicsPath() { FillMode = pg.FillRule == FillRule.EvenOdd ? PDF.XFillMode.Alternate : PDF.XFillMode.Winding }; foreach (var pf in pg.Figures) { var startPoint = pf.StartPoint; foreach (var segment in pf.Segments) { if (segment is ArcSegmentViewModel arcSegment) { #if WPF var point1 = new PDF.XPoint( scale(startPoint.X), scale(startPoint.Y)); var point2 = new PDF.XPoint( scale(arcSegment.Point.X), scale(arcSegment.Point.Y)); var size = new PDF.XSize( scale(arcSegment.Size.Width), scale(arcSegment.Size.Height)); gp.AddArc( point1, point2, size, arcSegment.RotationAngle, arcSegment.IsLargeArc, arcSegment.SweepDirection == SweepDirection.Clockwise ? PDF.XSweepDirection.Clockwise : PDF.XSweepDirection.Counterclockwise); startPoint = arcSegment.Point; #else // TODO: Convert WPF/SVG elliptical arc segment format to GDI+ bezier curves. startPoint = arcSegment.Point; #endif } else if (segment is CubicBezierSegmentViewModel cubicBezierSegment) { gp.AddBezier( scale(startPoint.X), scale(startPoint.Y), scale(cubicBezierSegment.Point1.X), scale(cubicBezierSegment.Point1.Y), scale(cubicBezierSegment.Point2.X), scale(cubicBezierSegment.Point2.Y), scale(cubicBezierSegment.Point3.X), scale(cubicBezierSegment.Point3.Y)); startPoint = cubicBezierSegment.Point3; } else if (segment is LineSegmentViewModel) { var lineSegment = segment as LineSegmentViewModel; gp.AddLine( scale(startPoint.X), scale(startPoint.Y), scale(lineSegment.Point.X), scale(lineSegment.Point.Y)); startPoint = lineSegment.Point; } else if (segment is QuadraticBezierSegmentViewModel quadraticBezierSegment) { var p1 = startPoint; var p2 = quadraticBezierSegment.Point1; var p3 = quadraticBezierSegment.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), scale(y1), scale(x2), scale(y2), scale(x3), scale(y3), scale(x4), scale(y4)); startPoint = quadraticBezierSegment.Point2; } else { throw new NotSupportedException("Not supported segment type: " + segment.GetType()); } } if (pf.IsClosed) { gp.CloseFigure(); } else { gp.StartFigure(); } } return(gp); }