internal static Geometry Copy(Geometry g) { if (g == null) return null; RectangleGeometry rg = g as RectangleGeometry; if (rg != null) { return new RectangleGeometry() { Rect = rg.Bounds, RadiusX = rg.RadiusX, RadiusY = rg.RadiusY, Transform = rg.Transform }; } EllipseGeometry eg = g as EllipseGeometry; if (eg != null) { return new EllipseGeometry() { Center = eg.Center, RadiusX = eg.RadiusX, RadiusY = eg.RadiusY, Transform = eg.Transform }; } LineGeometry lg = g as LineGeometry; if (lg != null) { return new LineGeometry() { StartPoint = lg.StartPoint, EndPoint = lg.EndPoint, Transform = lg.Transform }; } PathGeometry pg = g as PathGeometry; if (pg != null) { if (!Geo.PathGeometryHasFigures(pg)) { return new RectangleGeometry() { Rect = pg.Bounds, RadiusX = 0, RadiusY = 0, Transform = pg.Transform }; } else { PathGeometry pg2 = new PathGeometry(); pg2.FillRule = pg.FillRule; pg2.Figures = new PathFigureCollection(); // required for Geo.PathGeometryHasFigures to work foreach (PathFigure pf in pg.Figures) { PathFigure pf2 = new PathFigure(); pf2.StartPoint = pf.StartPoint; foreach (PathSegment ps in pf.Segments) { pf2.Segments.Add(Copy(ps)); } pf2.IsClosed = pf.IsClosed; pf2.IsFilled = pf.IsFilled; pg2.Figures.Add(pf2); } pg2.Transform = pg.Transform; return pg2; } } GeometryGroup gg = g as GeometryGroup; if (gg != null) { GeometryGroup gg2 = new GeometryGroup(); gg2.FillRule = gg.FillRule; foreach (Geometry x in gg.Children) { gg2.Children.Add(Copy(x)); } gg2.Transform = gg.Transform; return gg2; } Diagram.Error("Copying an unknown kind of Geometry: " + g.ToString()); return null; }
private static void ExportGeometry(FixedContentEditor editor, FixedContentEditor filledEditor, Geometry geometry, bool isConnection = false) { // We need two editors because there might be filled and not filled figures. #if WPF var pathGeometry = geometry as PathGeometry; #else var pathGeometry = GeometryParser.GetGeometry(geometry.ToString()) as PathGeometry; #endif if (pathGeometry != null) { var path = new G.PathGeometry(); var filledPath = new G.PathGeometry(); for (int i = 0; i < pathGeometry.Figures.Count; i++) { var figure = pathGeometry.Figures[i]; var newFigure = new G.PathFigure(); newFigure.StartPoint = figure.StartPoint; newFigure.IsClosed = figure.IsClosed; foreach (var segment in figure.Segments) { var arc = segment as ArcSegment; if (arc != null) { var newS = new G.ArcSegment(); newS.Point = arc.Point; newS.RadiusX = arc.Size.Width; newS.RadiusY = arc.Size.Height; newS.RotationAngle = arc.RotationAngle; // why new enum ? if (arc.SweepDirection == SweepDirection.Clockwise) newS.SweepDirection = G.SweepDirection.Clockwise; else newS.SweepDirection = G.SweepDirection.Counterclockwise; newS.IsLargeArc = arc.IsLargeArc; newFigure.Segments.Add(newS); continue; } var bezier = segment as BezierSegment; if (bezier != null) { var newS = new G.BezierSegment(); newS.Point1 = bezier.Point1; newS.Point2 = bezier.Point2; newS.Point3 = bezier.Point3; newFigure.StartPoint = newFigure.StartPoint; newFigure.Segments.Add(newS); continue; } var polyLine = segment as PolyLineSegment; if (polyLine != null) { foreach (var point in polyLine.Points) { var newS = new G.LineSegment(); newS.Point = point; newFigure.Segments.Add(newS); } continue; } var line = segment as LineSegment; if (line != null) { var newS = new G.LineSegment(); newS.Point = line.Point; newFigure.Segments.Add(newS); continue; } var quadraticBezier = segment as QuadraticBezierSegment; if (quadraticBezier != null) { var newS = new G.QuadraticBezierSegment(); newS.Point1 = quadraticBezier.Point1; newS.Point2 = quadraticBezier.Point2; newFigure.Segments.Add(newS); continue; } } #if SILVERLIGHT if (isConnection) { var realGeometry = geometry as PathGeometry; if (realGeometry != null && realGeometry.Figures.Count > i) { if (realGeometry.Figures[i].IsFilled) filledPath.Figures.Add(newFigure); else path.Figures.Add(newFigure); continue; } } #endif if (figure.IsFilled) filledPath.Figures.Add(newFigure); else path.Figures.Add(newFigure); } // why new enum ? if (pathGeometry.FillRule == FillRule.EvenOdd) { path.FillRule = G.FillRule.EvenOdd; filledPath.FillRule = G.FillRule.EvenOdd; } else { path.FillRule = G.FillRule.Nonzero; filledPath.FillRule = G.FillRule.Nonzero; } if (filledPath.Figures.Count > 0) filledEditor.DrawPath(filledPath); if (path.Figures.Count > 0) editor.DrawPath(path); } }
private static bool FindMatchingPath(Geometry menuItemPathData, Path p) { return p.Data.ToString() == menuItemPathData.ToString(); }