/// <summary> /// Adjusts the edge end points so they don't end outside the shape of the node they are attached to. /// </summary> private static void AdjustPortLocation(LayoutGraph graph, Edge e, YPointPath path, bool atSource) { Node node = atSource ? e.Source : e.Target; YPoint pointRel = atSource ? graph.GetSourcePointRel(e) : graph.GetTargetPointRel(e); // get offset from the node center to the end of the shape at the node side the edge connects to LineSegment segment = path.GetLineSegment(atSource ? 0 : path.Length() - 2); double offset = Math.Min(graph.GetWidth(node), graph.GetHeight(node)) / 2; double offsetX = segment.DeltaX > 0 ^ atSource ? -offset : offset; double offsetY = segment.DeltaY > 0 ^ atSource ? -offset : offset; // if the edge end point is at the center of this side, we use the calculated offset to put the end point on // the node bounds, otherwise we prolong the last segment to the center line of the node so it doesn't end // outside the node's shape YPoint newPortLocation = segment.IsHorizontal ? new YPoint(pointRel.Y != 0 ? 0 : offsetX, pointRel.Y) : new YPoint(pointRel.X, pointRel.X != 0 ? 0 : offsetY); if (atSource) { graph.SetSourcePointRel(e, newPortLocation); } else { graph.SetTargetPointRel(e, newPortLocation); } }
public override void ApplyLayout(LayoutGraph graph) { // determine the single node to keep at the center. var provider = graph.GetDataProvider("NodeLayouts"); Node centerNode = null; if (provider != null) { centerNode = graph.Nodes.FirstOrDefault(n => provider.Get(n) != null); } if (CoreLayout != null) { if (centerNode != null) { // remember old center RectD oldLayout = (RectD)provider.Get(centerNode); var fixedLocation = new YPoint(graph.GetX(centerNode) + graph.GetWidth(centerNode), graph.GetY(centerNode)); //Set to saved size (this is important for collapsed nodes to ensure correct size) graph.SetSize(centerNode, oldLayout.Width, oldLayout.Height); // run layout CoreLayout.ApplyLayout(graph); // obtain new center var newFixedLocation = new YPoint(graph.GetX(centerNode) + graph.GetWidth(centerNode), graph.GetY(centerNode)); // and adjust the layout LayoutGraphUtilities.MoveSubgraph(graph, graph.GetNodeCursor(), fixedLocation.X - newFixedLocation.X, fixedLocation.Y - newFixedLocation.Y); } else { CoreLayout.ApplyLayout(graph); } } }
/// <summary> /// Returns the calculated location of the edge label. Note that the labeling /// machinery returns the edge labels positions as a parameter /// of the model that belongs to the label. This model parameter can be used /// to retrieve the actual location of the label as shown in this method. /// </summary> private static YPoint GetEdgeLabelLocation(LayoutGraph graph, Edge e, IEdgeLabelLayout ell) { var placement = ell.LabelModel.GetLabelPlacement( ell.BoundingBox, graph.GetLayout(e), graph.GetLayout(e.Source), graph.GetLayout(e.Target), ell.ModelParameter); YPoint ellp = new YPoint(placement.Anchor.X, placement.Anchor.Y - placement.Height); return(ellp); }
protected void PaintEdge(Graphics g, LayoutGraph graph, Edge e) { IEdgeLayout el = graph.GetLayout(e); YPoint sp = graph.GetSourcePointAbs(e); YPoint tp = graph.GetTargetPointAbs(e); PointF[] points = new PointF[el.PointCount() + 2]; points[0] = new PointF((float)sp.X, (float)sp.Y); points[el.PointCount() + 1] = new PointF((float)tp.X, (float)tp.Y); for (int i = 0; i < el.PointCount(); i++) { YPoint p = el.GetPoint(i); points[i + 1] = new PointF((float)p.X, (float)p.Y); } g.DrawLines(edgePen, points); }
/// <summary> /// Called by the various edge creation callbacks to create an edge in the resulting graph view /// that corresponds to the provided <paramref name="layoutEdge"/>. /// </summary> /// <remarks> /// If a model edge is provided, the edge will be created between the copies of the corresponding /// source/target ports. /// </remarks> ///<param name="pageLayoutGraph">The layout graph representing the current page.</param> ///<param name="pageView">The <see cref="IGraph"/> that is built to show the multi-page layout in a graph canvas.</param> ///<param name="layoutEdge">The edge of the layout graph that should be copied.</param> ///<param name="modelEdge">The edge of the original input graph that corresponds to the <paramref name="layoutEdge"/> (may be <see langword="null"/>).</param> ///<param name="edgeDefaults"></param> ///<returns>The created edge</returns> /// <seealso cref="CreateConnectorEdge"/> /// <seealso cref="CreateNormalEdge"/> /// <seealso cref="CreateProxyEdge"/> /// <seealso cref="CreateProxyReferenceEdge"/> protected IEdge CreateEdgeCore(LayoutGraph pageLayoutGraph, IGraph pageView, Edge layoutEdge, IEdge modelEdge, IEdgeDefaults edgeDefaults) { IEdge viewEdge; if (modelEdge != null) { // if the edge has a model edge: create the copied edge between // the copies of its source and target ports IPort modelSourcePort = modelEdge.SourcePort; IPort modelTargetPort = modelEdge.TargetPort; IPort viewSourcePort = GetViewPort(modelSourcePort); IPort viewTargetPort = GetViewPort(modelTargetPort); IEdgeStyle style = (IEdgeStyle)(edgeDefaults.Style != NullEdgeStyle ? edgeDefaults.GetStyleInstance() : modelEdge.Style.Clone()); viewEdge = pageView.CreateEdge(viewSourcePort, viewTargetPort, style, modelEdge.Tag); } else { // otherwise create it between the copies of its source and target nodes INode viewSource = GetViewNode(layoutEdge.Source); INode viewTarget = GetViewNode(layoutEdge.Target); viewEdge = pageView.CreateEdge(viewSource, viewTarget); } // adjust the port location YPoint newSourcePortLocation = pageLayoutGraph.GetSourcePointAbs(layoutEdge); YPoint newTargetPortLocation = pageLayoutGraph.GetTargetPointAbs(layoutEdge); pageView.SetPortLocation(viewEdge.SourcePort, newSourcePortLocation.ToPointD()); pageView.SetPortLocation(viewEdge.TargetPort, newTargetPortLocation.ToPointD()); // and copy the bends IEdgeLayout edgeLayout = pageLayoutGraph.GetLayout(layoutEdge); for (int i = 0; i < edgeLayout.PointCount(); i++) { YPoint bendLocation = edgeLayout.GetPoint(i); pageView.AddBend(viewEdge, new PointD(bendLocation.X, bendLocation.Y), i); } return(viewEdge); }
public static YPointCollection ConvertCompaniesToDto(System.Collections.Generic.List <DAC.Companies> list) { if (list != null) { YPointCollection points = new YPointCollection(); foreach (var item in list) { YPoint point = new YPoint(); point.id = item.Id; YPointGeometry _geometry = new YPointGeometry(); _geometry.coordinates.Add(item.Latitude); _geometry.coordinates.Add(item.Longitude); point.geometry = _geometry; points.features.Add(point); //add city YPointProperties _properties = new YPointProperties(); _properties.city = item.CompanyDetails.City; point.properties = _properties; } return(points); } return(null); }
public YAdres(int idAdres, double Coord1, double Coord2) { id = idAdres; geometry = new YPoint(Coord1, Coord2); }
/// <summary> /// Executes the layout algorithm. /// </summary> /// <remarks> /// <para> /// Enlarges the node layout to fully encompass the rotated layout (the rotated layout's bounding box). /// If the <see cref="EdgeRoutingMode"/> is set to <see cref="RoutingMode.FixedPort"/> /// port constraints are created to keep the ports at their current location. /// Existing port constraints are adjusted to the rotation. /// </para> /// <para> /// Then, the <see cref="LayoutStageBase.CoreLayout"/> is executed. /// </para> /// <para> /// After the core layout the original node sizes are restored. /// If the <see cref="EdgeRoutingMode"/> is set to <see cref="RoutingMode.ShortestStraightPathToBorder"/> /// the last edge segment is extended from the bounding box to the rotated layout. /// </para> /// </remarks> public override void ApplyLayout(LayoutGraph graph) { if (CoreLayout == null) { return; } var boundsProvider = graph.GetDataProvider(RotatedNodeLayoutDpKey); if (boundsProvider == null) { // no provider: this stage adds nothing to the core layout CoreLayout.ApplyLayout(graph); return; } bool addedSourcePortConstraints = false; bool addedTargetPortContstraints = false; IDataMap sourcePortConstraints = (IDataMap)graph.GetDataProvider(PortConstraintKeys.SourcePortConstraintDpKey); IDataMap targetPortConstraints = (IDataMap)graph.GetDataProvider(PortConstraintKeys.TargetPortConstraintDpKey); if (EdgeRoutingMode == RoutingMode.FixedPort) { // Fixed port: create port constraints to keep the ports at position // in this case: create data providers if there are none yet if (sourcePortConstraints == null) { sourcePortConstraints = graph.CreateEdgeMap(); graph.AddDataProvider(PortConstraintKeys.SourcePortConstraintDpKey, sourcePortConstraints); addedSourcePortConstraints = true; } if (targetPortConstraints == null) { targetPortConstraints = graph.CreateEdgeMap(); graph.AddDataProvider(PortConstraintKeys.TargetPortConstraintDpKey, targetPortConstraints); addedTargetPortContstraints = true; } } try { var originalDimensions = new Dictionary <Node, OldDimensions>(); foreach (var node in graph.Nodes) { var nodeShape = (RotatedNodeShape)boundsProvider.Get(node); var orientedLayout = nodeShape != null ? nodeShape.OrientedLayout : null; var outline = nodeShape != null ? nodeShape.Outline : null; if (orientedLayout != null) { // if the current node is rotated: apply fixes // remember old layout and size var oldLayout = graph.GetLayout(node); var newLayout = orientedLayout.GetBounds().ToYRectangle(); var offset = new PointD(newLayout.X - oldLayout.X, newLayout.Y - oldLayout.Y); var originalSize = new SizeD(oldLayout.Width, oldLayout.Height); var oldDimensions = new OldDimensions { offset = offset, size = originalSize, outline = outline }; if (EdgeRoutingMode == RoutingMode.FixedPort) { // EdgeRoutingMode: FixedPort: keep the ports at their current location // The oriented layout's corners to find the best PortSide var tl = new PointD(orientedLayout.AnchorX + orientedLayout.UpX * orientedLayout.Height, orientedLayout.AnchorY + orientedLayout.UpY * orientedLayout.Height); var tr = new PointD(orientedLayout.AnchorX + orientedLayout.UpX * orientedLayout.Height - orientedLayout.UpY * orientedLayout.Width, orientedLayout.AnchorY + orientedLayout.UpY * orientedLayout.Height + orientedLayout.UpX * orientedLayout.Width); var bl = new PointD(orientedLayout.AnchorX, orientedLayout.AnchorY); var br = new PointD(orientedLayout.AnchorX - orientedLayout.UpY * orientedLayout.Width, orientedLayout.AnchorY + orientedLayout.UpX * orientedLayout.Width); // for each out edge foreach (var edge in node.OutEdges) { // create a strong port constraint for the side which is closest to the port location (without rotation) var constraint = sourcePortConstraints.Get(edge); if (constraint == null) { var point = graph.GetSourcePointAbs(edge).ToPointD(); var side = FindBestSide(point, bl, br, tl, tr); sourcePortConstraints.Set(edge, PortConstraint.Create(side, true)); } } foreach (var edge in node.InEdges) { // create a strong port constraint for the side which is closest to the port location (without rotation) var constraint = targetPortConstraints.Get(edge); if (constraint == null) { var point = graph.GetTargetPointAbs(edge).ToPointD(); var side = FindBestSide(point, bl, br, tl, tr); targetPortConstraints.Set(edge, PortConstraint.Create(side, true)); } } } // For source and target port constraints: fix the PortSide according to the rotation var angle = Math.Atan2(orientedLayout.UpY, orientedLayout.UpX); if (sourcePortConstraints != null) { foreach (var edge in node.OutEdges) { FixPortConstraintSide(sourcePortConstraints, edge, angle); } } if (targetPortConstraints != null) { foreach (var edge in node.InEdges) { FixPortConstraintSide(targetPortConstraints, edge, angle); } } // enlarge the node layout var position = new YPoint(newLayout.X, newLayout.Y); oldDimensions.location = position; originalDimensions.Add(node, oldDimensions); graph.SetLocation(node, position); graph.SetSize(node, newLayout); } } // =============================================================== CoreLayout.ApplyLayout(graph); // =============================================================== var groups = graph.GetDataProvider(GroupingKeys.GroupDpKey); foreach (var node in graph.Nodes) { if (groups != null && groups.GetBool(node)) { // groups don't need to be adjusted to their former size and location because their bounds are entirely // calculated by the layout algorithm and they are not rotated continue; } // for each node which has been corrected: undo the correction var oldDimensions = originalDimensions[node]; var offset = oldDimensions.offset; var originalSize = oldDimensions.size; var newLayout = graph.GetLayout(node); // create a general path representing the new roated layout var path = oldDimensions.outline; var transform = new Matrix2D(); transform.Translate(new PointD(newLayout.X - oldDimensions.location.X, newLayout.Y - oldDimensions.location.Y)); path.Transform(transform); // restore the original size graph.SetLocation(node, new YPoint(newLayout.X - offset.X, newLayout.Y - offset.Y)); graph.SetSize(node, originalSize.ToYDimension()); if (EdgeRoutingMode == RoutingMode.NoRouting) { // NoRouting still needs fix for self-loops foreach (var edge in node.Edges) { if (edge.SelfLoop) { FixPorts(graph, edge, path, false); FixPorts(graph, edge, path, true); } } continue; } if (EdgeRoutingMode != RoutingMode.ShortestStraightPathToBorder) { continue; } // enlarge the adjacent segment to the oriented rectangle (represented by the path) // handling in and out edges separately will automatically cause selfloops to be handled correctly foreach (var edge in node.InEdges) { FixPorts(graph, edge, path, false); } foreach (var edge in node.OutEdges) { FixPorts(graph, edge, path, true); } } } finally { // if data provider for the port constraints have been added // remove and dispose them if (addedSourcePortConstraints) { graph.RemoveDataProvider(PortConstraintKeys.SourcePortConstraintDpKey); graph.DisposeEdgeMap((IEdgeMap)sourcePortConstraints); } if (addedTargetPortContstraints) { graph.RemoveDataProvider(PortConstraintKeys.TargetPortConstraintDpKey); graph.DisposeEdgeMap((IEdgeMap)targetPortConstraints); } } }
public override void ApplyLayout(LayoutGraph graph) { ApplyLayoutCore(graph); foreach (Node n in graph.Nodes) { foreach (Edge e in n.OutEdges) { bool lastSegmentOverlap = false; IEdgeLayout er = graph.GetLayout(e); if (er.PointCount() > 0) { // last bend point YPoint bendPoint = er.GetPoint(er.PointCount() - 1); IEnumerator <Edge> ecc = n.OutEdges.GetEnumerator(); loop : while (ecc.MoveNext()) { Edge eccEdge = ecc.Current; if (eccEdge != e) { YPointPath path = graph.GetPath(eccEdge); for (ILineSegmentCursor lc = path.LineSegments(); lc.Ok; lc.Next()) { LineSegment seg = lc.LineSegment; if (seg.Contains(bendPoint)) { lastSegmentOverlap = true; goto loop; } } } } } YList points = graph.GetPointList(e); for (ListCell c = points.FirstCell; c != null; c = c.Succ()) { YPoint p = (YPoint)c.Info; if (c.Succ() == null && !lastSegmentOverlap) { break; } YPoint p0 = (YPoint)(c.Pred() == null ? graph.GetSourcePointAbs(e) : c.Pred().Info); YPoint p2; if (Math.Abs(p0.X - p.X) < 0.01) { p2 = new YPoint(p.X, p.Y - 0.001); } else { p2 = new YPoint(p.X - 0.001, p.Y); } points.InsertBefore(p2, c); } graph.SetPoints(e, points); } } }