Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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
        }