private void DrawImplementationPlan(string filepath) { var converter = Manufactory.CreateImplementationPlanConverter(ConverterTypes.JSON); converter.ParseDocument(filepath); var blocks = converter.GetBlocks(); var links = converter.GetLinks(); var graph = new Graph(blocks, links); ulong startX = 30; ulong startY = 30; var countBlocksInLevel = new Dictionary<ulong, ulong>(); for (ulong i = 0; i <= graph.GetMaxLevel(); i++) { countBlocksInLevel.Add(i, 0); } var grids = new List<EllipseIP>(); foreach (var block in blocks) { var currentX = startX + (2*startX*countBlocksInLevel[block.Level] + 20); var currentY = (block.Level*startY + startY + 40*block.Level); var grid = CreateGrid(currentY, currentX, block.Id); if (block.Level > 0) { var currentLinks = links.Where(x => x.To == block.Id); var currentGrids = currentLinks.Select(l => grids.FirstOrDefault(x => ulong.Parse(x.Tag.ToString()) == l.From)).ToList(); double x1 = 0; double y1 = 0; foreach (var g in currentGrids) { x1 += Canvas.GetLeft(g); y1 = Canvas.GetTop(g); } x1 /= currentGrids.Count; y1 += currentGrids[0].Height; foreach (var g in currentGrids) { var line = CreateAPolyline(Canvas.GetLeft(g) + g.GetWidth()/2, Canvas.GetTop(g) + g.GetHeight(), x1 + g.GetWidth()/2, currentY); ImageCanvas.Children.Add(line); } grid = CreateGrid(currentY, x1, block.Id, block.Level); } countBlocksInLevel[block.Level]++; grid.SetContent(block.Content); grids.Add(grid); } foreach (var g in grids) { ImageCanvas.Children.Add(g); } ImageCanvas.Width = 2*startX + (2 * startX * countBlocksInLevel[0] + 20); ImageCanvas.Height = (graph.GetMaxLevel() * startY + 4*startY + 40 * graph.GetMaxLevel()); }