public void Dispose() { Graph = default(TGraph); VertexPositions.Clear(); VisibleEdges.Clear(); AlgorithmStorage = null; }
public override void Compute(CancellationToken cancellationToken) { if (_graph.VertexCount == 0) { return; } if (_graph.VertexCount == 1) { VertexPositions.Clear(); VertexPositions[_graph.Vertices.First().Original] = new Point(0, 0); return; } // //Phase 1 - Filters & Removals // FiltersAndRemovals(); _statusInPercent = PERCENT_OF_PREPARATION; // //Phase 2 - Layer assignment // AssignLayers(); // //Phase 3 - Crossing reduction // PrepareForSugiyama(cancellationToken); SugiyamaLayout(cancellationToken); _statusInPercent = PERCENT_OF_PREPARATION + PERCENT_OF_SUGIYAMA; // //Phase 4 - Horizontal position assignment // CopyPositions(cancellationToken); OnIterationEnded("Position adjusting finished"); //Phase 5 - Incremental extension, add vertices connected with only general edges //IncrementalExtensionImproved(); _statusInPercent = PERCENT_OF_PREPARATION + PERCENT_OF_SUGIYAMA + PERCENT_OF_INCREMENTAL_EXTENSION; _statusInPercent = 100; }
protected override void InternalCompute() { if (_graph.VertexCount == 0) { return; } if (_graph.VertexCount == 1) { VertexPositions.Clear(); VertexPositions[_graph.Vertices.First().Original] = new Point(0, 0); return; } // //Phase 1 - Filters & Removals // FiltersAndRemovals(); _statusInPercent = percentOfPreparation; // //Phase 2 - Layer assignment // AssignLayers(); // //Phase 3 - Crossing reduction // PrepareForSugiyama(); SugiyamaLayout(); _statusInPercent = percentOfPreparation + percentOfSugiyama; // //Phase 4 - Horizontal position assignment // CopyPositions(); OnIterationEnded("Position adjusting finished"); //Phase 5 - Incremental extension, add vertices connected with only general edges //IncrementalExtensionImproved(); _statusInPercent = percentOfPreparation + percentOfSugiyama + percentOfIncrementalExtension; _statusInPercent = 100; }
public override void Compute(CancellationToken cancellationToken) { VertexPositions.Clear(); var bounds = _parameters == null ? new RandomLayoutAlgorithmParams().Bounds : _parameters.Bounds; var boundsWidth = (int)bounds.Width; var boundsHeight = (int)bounds.Height; var seed = _parameters == null?Guid.NewGuid().GetHashCode() : _parameters.Seed; var rnd = new Random(seed); foreach (var item in VisitedGraph.Vertices) { if (item.SkipProcessing != ProcessingOptionEnum.Freeze || VertexPositions.Count == 0) { var x = (int)bounds.X; var y = (int)bounds.Y; var size = VertexSizes.FirstOrDefault(a => a.Key == item).Value; VertexPositions.Add(item, new Point(rnd.Next(x, x + boundsWidth - (int)size.Width), rnd.Next(y, y + boundsHeight - (int)size.Height))); } } }
protected void CopyPositionsSilent(bool shouldTranslate) { //calculate the topLeft position var translation = new Vector(float.PositiveInfinity, float.PositiveInfinity); if (shouldTranslate) { foreach (var v in _graph.Vertices) { if (double.IsNaN(v.RealPosition.X) || double.IsNaN(v.RealPosition.Y)) { continue; } translation.X = Math.Min(v.RealPosition.X, translation.X); translation.Y = Math.Min(v.RealPosition.Y, translation.Y); } translation *= -1; translation.X += Parameters.VerticalGap / 2; translation.Y += Parameters.HorizontalGap / 2; //translate with the topLeft position foreach (var v in _graph.Vertices) { v.RealPosition += translation; } } else { translation = new Vector(0, 0); } //copy the positions of the vertices VertexPositions.Clear(); foreach (var v in _graph.Vertices) { if (v.IsDummyVertex) { continue; } Point pos = v.RealPosition; if (!shouldTranslate) { pos.X += v.Size.Width * 0.5 + translation.X; pos.Y += v.Size.Height * 0.5 + translation.Y; } VertexPositions[v.Original] = pos; } //copy the edge routes EdgeRoutes.Clear(); foreach (var e in _graph.HiddenEdges) { if (!e.IsLongEdge) { continue; } EdgeRoutes[e.Original] = e.IsReverted ? e.DummyVertices.Reverse().Select(dv => dv.RealPosition).ToArray() : e.DummyVertices.Select(dv => dv.RealPosition).ToArray(); } }