Exemplo n.º 1
0
        /// <summary>
        /// Возвращает дерево дочерних (deploy) элементов для указанного элемента
        /// </summary>
        /// <param name="element"></param>
        /// <returns></returns>
        public static DPTreeNode <EA.Element> GetDeployChildrenHierarchy(EA.Element element)
        {
            // Создаём корень
            DPTreeNode <EA.Element> result = new DPTreeNode <EA.Element>(element);

            // Получаем непосредственно размещённые элементы
            List <EA.Element> children = GetDeployChildren(element);

            // Проходимся по вложениям
            foreach (EA.Element child in children)
            {
                // получаем дочернее дерево и добавляем его к корневому узлу
                DPTreeNode <EA.Element> childTree = GetDeployChildrenHierarchy(child);
                result.AddChildNode(childTree);
            }

            return(result);
        }
Exemplo n.º 2
0
        // Вспомогательная функция добавления элемента в структуру строящегося дерева
        private static void AddDPNodeToList(List <DPTreeNode <ElementData> > dpTreeNodeList, ElementData sourceElementData, ElementData targetElementData)
        {
            // сначала ищем, нет ли уже элемента в структуре
            DPTreeNode <ElementData> sourceElementNode     = null;
            DPTreeNode <ElementData> sourceElementNodeRoot = null;
            DPTreeNode <ElementData> targetElementNode     = null;
            DPTreeNode <ElementData> targetElementNodeRoot = null;

            foreach (DPTreeNode <ElementData> curNode in dpTreeNodeList)
            {
                if (curNode.AllNodes.ContainsKey(sourceElementData.ID))
                {
                    sourceElementNode     = curNode.AllNodes[sourceElementData.ID];
                    sourceElementNodeRoot = curNode;
                }
                if (curNode.AllNodes.ContainsKey(targetElementData.ID))
                {
                    targetElementNode     = curNode.AllNodes[targetElementData.ID];
                    targetElementNodeRoot = curNode;
                }

                if (sourceElementNode != null && targetElementNode != null)
                {
                    break;
                }
            }

            // Варианты:
            // оба узла найдены и находятся в одной иерархии - ничего делать не надо
            if (sourceElementNode != null && targetElementNode != null && sourceElementNodeRoot == targetElementNodeRoot)
            {
                // Ничего не делаем
            }
            // оба узла найдены и находятся разных иерархиях - надо объъединить эти ветки
            if (sourceElementNode != null && targetElementNode != null && sourceElementNodeRoot != targetElementNodeRoot)
            {
                targetElementNode.AddChildNode(sourceElementNode);
                dpTreeNodeList.Remove(sourceElementNode);
            }
            // найден только дочерний узел - создаём в этой же ветке родительский и перевешиваем на него дочерний
            // такая ситуация возможна только если дочерний дежит на самом верху (временно является рутом данной ветки)
            else if (sourceElementNode != null && targetElementNode == null)
            {
                targetElementNode = new DPTreeNode <ElementData>(targetElementData, true);
                targetElementNode.AddChildNode(sourceElementNode);

                dpTreeNodeList.Remove(sourceElementNode);
                dpTreeNodeList.Add(targetElementNode);
            }
            // найден только родительский узел - создаём в этой же ветке  дочерний
            // такая ситуация возможна только если родительский лежит в самом низу ветки (временно является одним из листовых узлов)
            else if (sourceElementNode == null && targetElementNode != null)
            {
                sourceElementNode = new DPTreeNode <ElementData>(sourceElementData, false);
                targetElementNode.AddChildNode(sourceElementNode);
            }
            // оба не найдены - создаём оба узла в новой ветке
            else if (sourceElementNode == null && targetElementNode == null)
            {
                sourceElementNode = new DPTreeNode <ElementData>(sourceElementData, false);
                targetElementNode = new DPTreeNode <ElementData>(targetElementData, true);
                targetElementNode.AddChildNode(sourceElementNode);
                dpTreeNodeList.Add(targetElementNode);
            }
        }