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); }
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; }
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); }
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); }
public void RemoveCrossEdge(DEdge edge) { m_CrossEdges.Remove(edge); if (MainCanvas.Children.Contains(edge)) MainCanvas.Children.Remove(edge); }
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;*/ }
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); }
internal void RemoveInEdge(DEdge de) { _InEdges.Remove(de); }
internal void RemoveOutEdge(DEdge de) { _OutEdges.Remove(de); }
internal void AddSelfEdge(DEdge edge) { _SelfEdges.Add(edge); }
internal void AddInEdge(DEdge edge) { _InEdges.Add(edge); }
internal void AddOutEdge(DEdge edge) { _OutEdges.Add(edge); }
public static void DrawCrossEdge(DEdge edge) { DrawCrossEdges(edge.ParentGraph, new DEdge[] { edge }); }
internal void AddOutEdge(DEdge edge) { _OutEdges.Add(edge); }
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); }
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); }
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))); } }
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; }
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); }