Exemplo n.º 1
0
 internal static void DrawUnderlyingPolyline(PathGeometry pg, DEdge edge)
 {
     IEnumerable<WinPoint> points = edge.GeometryEdge.UnderlyingPolyline.Select(p => WinPoint(p));
     PathFigure pf = new PathFigure() { IsFilled = false, IsClosed = false, StartPoint = points.First() };
     foreach (WinPoint p in points)
     {
         if (p != points.First())
             pf.Segments.Add(new WinLineSegment() { Point = p });
         PathFigure circle = new PathFigure() { IsFilled = false, IsClosed = true, StartPoint = new WinPoint(p.X - edge.RadiusOfPolylineCorner, p.Y) };
         circle.Segments.Add(
            new ArcSegment()
            {
                Size = new WinSize(edge.RadiusOfPolylineCorner, edge.RadiusOfPolylineCorner),
                SweepDirection = SweepDirection.Clockwise,
                Point = new WinPoint(p.X + edge.RadiusOfPolylineCorner, p.Y)
            });
         circle.Segments.Add(
            new ArcSegment()
            {
                Size = new WinSize(edge.RadiusOfPolylineCorner, edge.RadiusOfPolylineCorner),
                SweepDirection = SweepDirection.Clockwise,
                Point = new WinPoint(p.X - edge.RadiusOfPolylineCorner, p.Y)
            });
         pg.Figures.Add(circle);
     }
     pg.Figures.Add(pf);
 }
        internal static List <ObjectWithBox> TessellateCurve(DEdge dedge, double radiusForUnderlyingPolylineCorners)
        {
            DrawingEdge          edge      = dedge.DrawingEdge;
            ICurve               bc        = edge.EdgeCurve;
            double               lineWidth = edge.Attr.LineWidth;
            List <ObjectWithBox> ret       = new List <ObjectWithBox>();
            int  n = 1;
            bool done;

            do
            {
                double d = (bc.ParEnd - bc.ParStart) / (double)n;
                done = true;
                if (n <= 64)//don't break a segment into more than 64 parts
                {
                    for (int i = 0; i < n; i++)
                    {
                        if (!WithinEpsilon(bc, d * i, d * (i + 1)))
                        {
                            n   *= 2;
                            done = false;
                            break;
                        }
                    }
                }
            }while (!done);

            double del = (bc.ParEnd - bc.ParStart) / n;

            for (int j = 0; j < n; j++)
            {
                Line line = new Line(dedge, bc[del * (double)j], bc[del * (double)(j + 1)], lineWidth);
                ret.Add(line);
            }

            //if (dedge.Label != null)
            //    pf.Add(new LabelGeometry(dedge.Label, edge.Label.Left,
            //                              edge.Label.Bottom, new MsaglPoint(edge.Label.Size.Width, edge.Label.Size.Height)));


            if (edge.Attr.ArrowAtTarget)
            {
                ret.Add(new Line(dedge, (MsaglPoint)edge.EdgeCurve.End, edge.ArrowAtTargetPosition, edge.Attr.LineWidth));
            }



            if (edge.Attr.ArrowAtSource)
            {
                ret.Add(
                    new Line(dedge, edge.EdgeCurve.Start, edge.ArrowAtSourcePosition, edge.Attr.LineWidth));
            }

            if (radiusForUnderlyingPolylineCorners > 0)
            {
                AddUnderlyingPolylineTessellation(ret, dedge, radiusForUnderlyingPolylineCorners);
            }

            return(ret);
        }
Exemplo n.º 3
0
        internal static List<ObjectWithBox> TessellateCurve(DEdge dedge, double radiusForUnderlyingPolylineCorners)
        {
            DrawingEdge edge = dedge.DrawingEdge;
            ICurve bc = edge.EdgeCurve;
            double lineWidth = edge.Attr.LineWidth;
            List<ObjectWithBox> ret = new List<ObjectWithBox>();
            int n = 1;
            bool done;
            do
            {
                double d = (bc.ParEnd - bc.ParStart) / (double)n;
                done = true;
                if (n <= 64)//don't break a segment into more than 64 parts
                    for (int i = 0; i < n; i++)
                    {
                        if (!WithinEpsilon(bc, d * i, d * (i + 1)))
                        {
                            n *= 2;
                            done = false;
                            break;
                        }
                    }
            }
            while (!done);

            double del = (bc.ParEnd - bc.ParStart) / n;

            for (int j = 0; j < n; j++)
            {
                Line line = new Line(dedge, bc[del * (double)j], bc[del * (double)(j + 1)], lineWidth);
                ret.Add(line);
            }

            //if (dedge.Label != null)
            //    pf.Add(new LabelGeometry(dedge.Label, edge.Label.Left,
            //                              edge.Label.Bottom, new MsaglPoint(edge.Label.Size.Width, edge.Label.Size.Height)));

            if (edge.Attr.ArrowAtTarget)
                ret.Add(new Line(dedge, (MsaglPoint)edge.EdgeCurve.End, edge.ArrowAtTargetPosition, edge.Attr.LineWidth));

            if (edge.Attr.ArrowAtSource)
                ret.Add(
                        new Line(dedge, edge.EdgeCurve.Start, edge.ArrowAtSourcePosition, edge.Attr.LineWidth));

            if (radiusForUnderlyingPolylineCorners > 0)
                AddUnderlyingPolylineTessellation(ret, dedge, radiusForUnderlyingPolylineCorners);

            return ret;
        }
Exemplo n.º 4
0
        internal static void DrawUnderlyingPolyline(PathGeometry pg, DEdge edge)
        {
            IEnumerable <WinPoint> points = edge.GeometryEdge.UnderlyingPolyline.Select(p => WinPoint(p));
            PathFigure             pf     = new PathFigure()
            {
                IsFilled = false, IsClosed = false, StartPoint = points.First()
            };

            foreach (WinPoint p in points)
            {
                if (p != points.First())
                {
                    pf.Segments.Add(new WinLineSegment()
                    {
                        Point = p
                    });
                }
                PathFigure circle = new PathFigure()
                {
                    IsFilled = false, IsClosed = true, StartPoint = new WinPoint(p.X - edge.RadiusOfPolylineCorner, p.Y)
                };
                circle.Segments.Add(
                    new ArcSegment()
                {
                    Size           = new WinSize(edge.RadiusOfPolylineCorner, edge.RadiusOfPolylineCorner),
                    SweepDirection = SweepDirection.Clockwise,
                    Point          = new WinPoint(p.X + edge.RadiusOfPolylineCorner, p.Y)
                });
                circle.Segments.Add(
                    new ArcSegment()
                {
                    Size           = new WinSize(edge.RadiusOfPolylineCorner, edge.RadiusOfPolylineCorner),
                    SweepDirection = SweepDirection.Clockwise,
                    Point          = new WinPoint(p.X - edge.RadiusOfPolylineCorner, p.Y)
                });
                pg.Figures.Add(circle);
            }
            pg.Figures.Add(pf);
        }
Exemplo n.º 5
0
        public DEdge AddEdgeBetweenNodes(DNode source, DNode target)
        {
            if (!IsContainedSub(source))
                throw new InvalidOperationException("The edge source node must be in the graph or in one of its nested graphs.");
            if (!IsContainedSub(target))
                throw new InvalidOperationException("The edge target node must be in the graph or in one of its nested graphs.");
            if (source.ParentGraph == this && target.ParentGraph == this)
            {
                DEdge dEdge = new DEdge(source, target, new DrawingEdge(source.Node, target.Node, ConnectionToGraph.Disconnected), ConnectionToGraph.Disconnected);
                GeometryEdge gEdge = new GeometryEdge(source.GeometryNode, target.GeometryNode) { GeometryParent = Graph.GeometryGraph };
                dEdge.GeometryEdge = gEdge;
                dEdge.ArrowheadAtTarget = ArrowStyle.Normal;

                AddEdge(dEdge, false);

                return dEdge;
            }
            else
                return AddCrossEdge(source, target);
        }
Exemplo n.º 6
0
 public void RemoveCrossEdge(DEdge edge)
 {
     m_CrossEdges.Remove(edge);
     if (MainCanvas.Children.Contains(edge))
         MainCanvas.Children.Remove(edge);
 }
Exemplo n.º 7
0
        private DEdge AddCrossEdge(DNode source, DNode target)
        {
            DEdge dEdge = new DEdge(source, target, new DrawingEdge(source.Node, target.Node, ConnectionToGraph.Disconnected), ConnectionToGraph.Disconnected);
            GeometryEdge gEdge = new GeometryEdge(source.GeometryNode, target.GeometryNode) { GeometryParent = Graph.GeometryGraph };
            dEdge.GeometryEdge = gEdge;
            dEdge.ArrowheadAtTarget = ArrowStyle.Normal;

            m_CrossEdges.Add(dEdge);

            return dEdge;

            /*DEdge ret;
            var s = VisualTreeHelper.GetRoot(this);
            var ss = VisualTreeHelper.GetRoot(source);
            var ts = VisualTreeHelper.GetRoot(target);
            if (s != ss || s != ts || ss != ts)
                ret = new DEdge(source, target, null, ConnectionToGraph.Disconnected);
            else
                ret = NestedGraphHelper.DrawCrossEdge(this, source, target);
            m_CrossEdges.Add(ret);
            return ret;*/
        }
Exemplo n.º 8
0
 public IViewerEdge RouteEdge(DrawingEdge edgeToRoute)
 {
     edgeToRoute.Label = new Drawing.Label();
     GeometryEdge geometryEdge = edgeToRoute.GeometryEdge = new GeometryEdge();
     geometryEdge.GeometryParent = Graph.GeometryGraph;
     geometryEdge.Source = edgeToRoute.SourceNode.GeometryNode;
     geometryEdge.Target = edgeToRoute.TargetNode.GeometryNode;
     //geometryEdge.ArrowheadLength = edgeToRoute.Attr.ArrowheadLength;
     geometryEdge.SourcePort = edgeToRoute.SourcePort;
     geometryEdge.TargetPort = edgeToRoute.TargetPort;
     if (edgeToRoute.Source == edgeToRoute.Target)
     {
         RectilinearInteractiveEditor.CreateSimpleEdgeCurve(geometryEdge);
     }
     else
     {
         RouteEdge(geometryEdge);
         Arrowheads.TrimSplineAndCalculateArrowheads(geometryEdge, geometryEdge.Curve, false, true);
         //Arrowheads.FixArrowheadAtSource(geometryEdge.EdgeGeometry, edgeToRoute.SourcePort);
         //Arrowheads.FixArrowheadAtTarget(geometryEdge.EdgeGeometry, edgeToRoute.TargetPort);
     }
     var dEdge = new DEdge(NodeMap[edgeToRoute.SourceNode.Id], NodeMap[edgeToRoute.TargetNode.Id],
                           edgeToRoute, ConnectionToGraph.Disconnected);
     dEdge.Label = new DTextLabel(dEdge, new Drawing.Label());
     return dEdge;
 }
 internal void RemoveInEdge(DEdge de)
 {
     _InEdges.Remove(de);
 }
 internal void AddSelfEdge(DEdge edge)
 {
     _SelfEdges.Add(edge);
 }
Exemplo n.º 11
0
 internal void RemoveInEdge(DEdge de)
 {
     _InEdges.Remove(de);
 }
Exemplo n.º 12
0
 internal void RemoveOutEdge(DEdge de)
 {
     _OutEdges.Remove(de);
 }
Exemplo n.º 13
0
 internal void AddSelfEdge(DEdge edge)
 {
     _SelfEdges.Add(edge);
 }
Exemplo n.º 14
0
 internal void AddInEdge(DEdge edge)
 {
     _InEdges.Add(edge);
 }
Exemplo n.º 15
0
 internal void AddOutEdge(DEdge edge)
 {
     _OutEdges.Add(edge);
 }
Exemplo n.º 16
0
 public static void DrawCrossEdge(DEdge edge)
 {
     DrawCrossEdges(edge.ParentGraph, new DEdge[] { edge });
 }
 internal void AddOutEdge(DEdge edge)
 {
     _OutEdges.Add(edge);
 }
Exemplo n.º 18
0
 internal void RemoveSelfEdge(DEdge de)
 {
     _SelfEdges.Remove(de);
 }
 internal void AddInEdge(DEdge edge)
 {
     _InEdges.Add(edge);
 }
        private static void AddUnderlyingPolylineTessellation(List <ObjectWithBox> list, DEdge edge, double radiusForUnderlyingPolylineCorners)
        {
            MsaglPoint rad = new MsaglPoint(radiusForUnderlyingPolylineCorners, radiusForUnderlyingPolylineCorners);
            IEnumerator <MsaglPoint> en = edge.DrawingEdge.GeometryEdge.UnderlyingPolyline.GetEnumerator();

            en.MoveNext();
            MsaglPoint p = en.Current;

            list.Add(new Geometry(edge, new MsaglRectangle(p + rad, p - rad)));
            while (en.MoveNext())
            {
                list.Add(new Line(edge, p, p = en.Current, edge.DrawingEdge.Attr.LineWidth));
                list.Add(new Geometry(edge, new MsaglRectangle(p + rad, p - rad)));
            }
        }
 internal void RemoveOutEdge(DEdge de)
 {
     _OutEdges.Remove(de);
 }
Exemplo n.º 22
0
        public DEdge AddEdgeBetweenNodes(DNode source, DNode target)
        {
            DEdge dEdge = new DEdge(source, target, new DrawingEdge(source.Node, target.Node, ConnectionToGraph.Disconnected), ConnectionToGraph.Disconnected);
            GeometryEdge gEdge = new GeometryEdge(source.GeometryNode, target.GeometryNode) { GeometryParent = Graph.GeometryGraph };
            dEdge.GeometryEdge = gEdge;
            dEdge.ArrowheadAtTarget = ArrowStyle.Normal;

            AddEdge(dEdge, false);

            return dEdge;
        }
 internal void RemoveSelfEdge(DEdge de)
 {
     _SelfEdges.Remove(de);
 }
Exemplo n.º 24
0
 private static void AddUnderlyingPolylineTessellation(List<ObjectWithBox> list, DEdge edge, double radiusForUnderlyingPolylineCorners)
 {
     MsaglPoint rad = new MsaglPoint(radiusForUnderlyingPolylineCorners, radiusForUnderlyingPolylineCorners);
     IEnumerator<MsaglPoint> en = edge.DrawingEdge.GeometryEdge.UnderlyingPolyline.GetEnumerator();
     en.MoveNext();
     MsaglPoint p = en.Current;
     list.Add(new Geometry(edge, new MsaglRectangle(p + rad, p - rad)));
     while (en.MoveNext())
     {
         list.Add(new Line(edge, p, p = en.Current, edge.DrawingEdge.Attr.LineWidth));
         list.Add(new Geometry(edge, new MsaglRectangle(p + rad, p - rad)));
     }
 }
Exemplo n.º 25
0
        public IViewerEdge CreateEdgeWithGivenGeometry(DrawingEdge drawingEdge)
        {
            GeometryEdge geometryEdge = drawingEdge.GeometryEdge;
            geometryEdge.GeometryParent = Graph.GeometryGraph;

            var dEdge = new DEdge(NodeMap[drawingEdge.SourceNode.Id], NodeMap[drawingEdge.TargetNode.Id], drawingEdge, ConnectionToGraph.Disconnected);
            if (drawingEdge.Label != null)
                dEdge.Label = new DTextLabel(dEdge, new Drawing.Label());

            dEdge.MakeVisual();
            return dEdge;
        }
Exemplo n.º 26
0
 static BBNode BuildBBHierarchyUnderDEdge(DEdge dEdge)
 {
     if (dEdge.DrawingEdge.GeometryObject == null ||
         dEdge.Edge.GeometryEdge.Curve == null)
         return null;
     List<ObjectWithBox> geometries = Tessellator.TessellateCurve(dEdge, dEdge.MarkedForDragging ? dEdge.RadiusOfPolylineCorner : 0);
     return SpatialAlgorithm.CreateBBNodeOnGeometries(geometries);
 }