/// <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); }
// Вспомогательная функция добавления элемента в структуру строящегося дерева 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); } }