private DrawGraphInfo SituateOrderTree(Page CurNode, DrawGraphInfo info) { if (CurNode.State == NodeSate.Set) { info.SetVertical(CurNode.PositionY); return(info); } if (CurNode.Children != null) { DrawGraphInfo buffer = info; double maxVertical = 0;//info.Vertical; List <Link> childrenLinks = CurNode.links.Where(a => a.IsParent && a.Yes).ToList(); childrenLinks.AddRange(CurNode.links.Where(a => a.IsParent && !a.Yes)); foreach (var node in Nodes) { if (!childrenLinks.Select(a => a.LinkedNode).Contains(node)) { continue; } buffer = SituateOrderTree(node, buffer); maxVertical = Math.Max(maxVertical, buffer.Vertical); } return(info.SituateParent(CurNode, buffer.WithVertical(maxVertical))); } else { return(info.SituateGraphSheet(CurNode, info)); } }
public DrawGraphInfo SituateGraphSheet(Page node, DrawGraphInfo info) { DrawGraphInfo buffer = new DrawGraphInfo(); node.PositionY = node.Height; node.PositionX = info.LastNode.X + HorisontalSpacing; node.State = NodeSate.Set; buffer.LastNode.X = node.PositionX + node.Width; buffer.LastNode.Y = VerticalSpacing + node.Height; return(buffer); }
public DrawGraphInfo SituateParent(Page node, DrawGraphInfo info) { DrawGraphInfo buffer = new DrawGraphInfo(); node.PositionY = info.LastNode.Y + VerticalSpacing + node.Height; if (node.Children.Count > 1) { node.PositionX = (info.LastNode.X + LastNode.X) / 2 - node.Width / 2; } else { node.PositionX = this.LastNode.X + HorisontalSpacing; } node.State = NodeSate.Set; buffer.LastNode.Y = node.PositionY + node.Height; buffer.LastNode.X = Math.Max(info.LastNode.X, node.PositionX + node.Width + HorisontalSpacing); return(buffer); }
private void DrawTree() { List <KeyValuePair <Link, Link> > CrossingLinks = new List <KeyValuePair <Link, Link> >(); #region выделяем все связи List <Link> bufferOfLinks = new List <Link>(); foreach (var node in Nodes) { bufferOfLinks.AddRange(node.links.Where(a => a.IsParent)); } #endregion #region Находим пересекающиеся линии for (int i = 0; i < bufferOfLinks.Count; i++) { for (int j = i + 1; j < bufferOfLinks.Count; j++) { if (linesIntersect(bufferOfLinks[i], bufferOfLinks[j])) { CrossingLinks.Add(new KeyValuePair <Link, Link>(bufferOfLinks[i], bufferOfLinks[j])); } } } #endregion foreach (var item in CrossingLinks) { Swap(item.Key, item.Value); } #region highlight the crossing lines #endregion #region стандартное отображение #region очистка if (Nodes.Count == 0) { return; } WorkPlace.Children.Clear(); #endregion #region отрисовка блоков foreach (var item in Nodes) { WorkPlace.Children.Add(item); UpdateLayout(); } #endregion Page firstNode = Nodes.First(); if (firstNode == null || Nodes.Where(a => a.Parents == null).Count() == 0) { MessageBox.Show("Отсутствует корневой элемент"); return; } DrawGraphInfo gi = new DrawGraphInfo(); foreach (var node in Nodes.Where(a => a.Parents == null)) { gi = SituateOrderTree(node, gi); } FlipTheGraph(); #region отрисовка связей foreach (var item in Nodes) { foreach (var link in item.links.Where((a) => { return(a.IsParent); })) { link.LinkToNode.Cursor = Cursors.Hand; link.LinkToNode.MouseRightButtonDown += new MouseButtonEventHandler(link_MouseRightButtonDown); WorkPlace.Children.Add(link.LinkToNode); WorkPlace.Children.Add(link.Arrow); } item.State = NodeSate.NotSet; } #endregion SituateGraphInCenter(); #endregion }