public static MoveTo Parse(String strCommand, IGeometryDataFigure previousFigure) { if (String.IsNullOrWhiteSpace(strCommand) || !strCommand.StartsWith("M", StringComparison.InvariantCultureIgnoreCase)) { return(null); } var datas = Helper.GetSplitStrings(strCommand.Substring(1), true, ','); if (datas.Count != 2) { return(null); } Double x, y; if (!Double.TryParse(datas[0], out x)) { return(null); } if (!Double.TryParse(datas[1], out y)) { return(null); } return(new MoveTo(new Point(x, y), previousFigure, strCommand.StartsWith("m"))); }
private MoveTo(Point point, IGeometryDataFigure previousFigure, Boolean isOffset = false) { this.PreviousFigure = previousFigure; this.StartPoint = point; if (isOffset && previousFigure != null) { this.StartPoint = new Point(previousFigure.EndPoint.X + point.X, previousFigure.EndPoint.Y + point.Y); } }
public static CloseTo Parse(String strCommand, IGeometryDataFigure previousFigure) { if (String.IsNullOrWhiteSpace(strCommand) || !strCommand.StartsWith("Z", StringComparison.InvariantCultureIgnoreCase)) { return(null); } return(new CloseTo(previousFigure)); }
private CloseTo(IGeometryDataFigure previousFigure) { this.PreviousFigure = previousFigure; this.StartPoint = previousFigure != null ? previousFigure.EndPoint : new Point(0, 0); var moveFigure = GetPreviousMoveFigure(); if (moveFigure != null) { this.EndPoint = moveFigure.StartPoint; } }
private LineTo(List <Point> points, IGeometryDataFigure previousFigure, Boolean isOffset = false) { Debug.Assert(points != null && points.Any()); this.Points = points; if (isOffset && previousFigure != null) { this.Points = points.Select(p => new Point(previousFigure.EndPoint.X + p.X, previousFigure.EndPoint.Y + p.Y)).ToList(); } this.PreviousFigure = previousFigure; this.StartPoint = previousFigure != null ? previousFigure.EndPoint : new Point(0, 0); this.EndPoint = this.Points.LastOrDefault(); }
public static List <IGeometryDataFigure> GetDataFigures(String strGeometryData) { if (String.IsNullOrWhiteSpace(strGeometryData) || !strGeometryData.StartsWith("M")) { return(null); } var figures = new List <IGeometryDataFigure>(); var commandChars = strGeometryData.Where(p => (p >= 'A' && p <= 'Z') || (p >= 'a' && p <= 'z')).ToList(); var leftString = strGeometryData.ToString(); for (int i = 0; i < commandChars.Count; i++) { int iTo = leftString.Length; if (i + 1 < commandChars.Count) { iTo = leftString.IndexOf(commandChars[i + 1]); } IGeometryDataFigure figure = null; var strCommand = leftString.Substring(0, iTo); if (strCommand.StartsWith("M", StringComparison.InvariantCultureIgnoreCase)) { figure = MoveTo.Parse(strCommand, figures.LastOrDefault()); } else if (strCommand.StartsWith("L", StringComparison.InvariantCultureIgnoreCase)) { figure = LineTo.Parse(strCommand, figures.LastOrDefault()); } else if (strCommand.StartsWith("A", StringComparison.InvariantCultureIgnoreCase)) { figure = ArcTo.Parse(strCommand, figures.LastOrDefault()); } else if (strCommand.StartsWith("Z", StringComparison.InvariantCultureIgnoreCase)) { figure = CloseTo.Parse(strCommand, figures.LastOrDefault()); } else { ExceptionHandler.ThrowException(String.Format("Unsupported geometry command: \"{0}\"", strCommand)); } if (figure != null) { figures.Add(figure); } leftString = leftString.Substring(iTo); } return(figures); }
public static ArcTo Parse(String strCommand, IGeometryDataFigure previousFigure) { if (String.IsNullOrWhiteSpace(strCommand) || !strCommand.StartsWith("A", StringComparison.InvariantCultureIgnoreCase)) { return(null); } var datas = Helper.GetSplitStrings(strCommand.Substring(1), true, ','); if (datas.Count != 7) { return(null); } double radiusX, radiusY, rotationAngle, endPointX, endPointY; int isLargeArc, sweepDirection; if (!Double.TryParse(datas[0], out radiusX)) { return(null); } if (!Double.TryParse(datas[1], out radiusY)) { return(null); } if (!Double.TryParse(datas[2], out rotationAngle)) { return(null); } if (!Int32.TryParse(datas[3], out isLargeArc)) { return(null); } if (!Int32.TryParse(datas[4], out sweepDirection)) { return(null); } if (!Double.TryParse(datas[5], out endPointX)) { return(null); } if (!Double.TryParse(datas[6], out endPointY)) { return(null); } return(new ArcTo(radiusX, radiusY, rotationAngle, isLargeArc, sweepDirection, new Point(endPointX, endPointY), previousFigure, strCommand.StartsWith("a"))); }
public static LineTo Parse(String strCommand, IGeometryDataFigure previousFigure) { if (String.IsNullOrWhiteSpace(strCommand) || !strCommand.StartsWith("L", StringComparison.InvariantCultureIgnoreCase)) { return(null); } var pointStrings = Helper.GetSplitStrings(strCommand.Substring(1), true, ' '); if (!pointStrings.Any()) { return(null); } var points = new List <Point>(); foreach (var pointString in pointStrings) { var datas = Helper.GetSplitStrings(pointString, true, ','); if (datas.Count != 2) { return(null); } Double x, y; if (!Double.TryParse(datas[0], out x)) { return(null); } if (!Double.TryParse(datas[1], out y)) { return(null); } points.Add(new Point(x, y)); } return(new LineTo(points, previousFigure, strCommand.StartsWith("l"))); }
private ArcTo(Double radiusX, Double radiusY, Double rotationAngle, int isLargeArc, int sweepDirection, Point endPoint, IGeometryDataFigure previousFigure, Boolean isOffset = false) { this.RadiusX = radiusX; this.RadiusY = radiusY; this.RotationAngle = rotationAngle; this.IsLargeArc = isLargeArc == 1; this.SweepDirection = sweepDirection == 1; this.EndPoint = endPoint; if (isOffset && previousFigure != null) { this.EndPoint = new Point(previousFigure.EndPoint.X + endPoint.X, previousFigure.EndPoint.Y + endPoint.Y); } this.PreviousFigure = previousFigure; this.StartPoint = previousFigure != null ? previousFigure.EndPoint : new Point(0, 0); }