Пример #1
0
    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;
    }
Пример #2
0
        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();
 }