public void SetGraphLayout(IDictionary<string, Point> layout)
{
// Shift layout into view.
Point vertexShift;
Size canvasSize;
if (layout.Any())
{
double minX = double.MaxValue;
double minY = double.MaxValue;
double maxX = double.MinValue;
double maxY = double.MinValue;
foreach (var point in layout.Values)
{
minX = Math.Min(point.X, minX);
minY = Math.Min(point.Y, minY);
maxX = Math.Max(point.X, maxX);
maxY = Math.Max(point.Y, maxY);
}
vertexShift = new Point(minX, minY).Multiply(-1);
canvasSize = new Size(maxX - minX, maxY - minY);
}
else
{
vertexShift = new Point();
canvasSize = new Size();
}
// Pad position and canvas size.
const float Padding = 300;
vertexShift = vertexShift.Add(new Point(Padding * 0.5, Padding * 0.5));
canvasSize.Height += Padding;
canvasSize.Width += Padding;
// Update positions.
foreach (var node in _nodes)
{
FRandomVariable variable = node.Tag as FRandomVariable;
Point position;
if (layout.TryGetValue(variable.Name, out position))
{
node.Position = position.Add(vertexShift);
}
else
{
node.Position = new Point();
}
}
// Update canvas.
xRoot.Width = canvasSize.Width * xRootScaleTransform.ScaleX;
xRoot.Height = canvasSize.Height * xRootScaleTransform.ScaleY;
// Edge thickness.
foreach (var edge in _edges)
{
edge.LineThickness = this._layoutOptions.EdgeThickness;
}
// Sizes.
this.UpdateNodeSizes();
}