public static DPTreeNode <String> GetLibComponentTree() { DPTreeNode <String> result = new DPTreeNode <String>(null); // Проходимся по дереву библиотеки и ищем компоненты. EA.Package libRootPackage = Context.CurrentLibrary; if (libRootPackage == null) { throw new Exception("Не обнаружена библиотека компоннетов"); } List <EA.Package> curLevelPackages = new List <EA.Package>(); curLevelPackages.Add(libRootPackage); do { foreach (EA.Package curPackage in curLevelPackages) { foreach (EA.Element curElement in curPackage.Elements) { if (LibraryHelper.IsLibrary(curElement)) { } } } } while (curLevelPackages.Count == 0); // пока не кончатся пакеты "уровнем ниже" return(result); }
/// <summary> /// Функция вычисляет, принадлежит ли переданный в функцию элемент указанному классификатору ПО текущей /// </summary> /// <param name="elementData"></param> /// <param name="softwareClassificationData"></param> /// <returns></returns> public static bool ISBelongsToSoftware(ElementData elementData, ElementData softwareClassificationData) { bool result = false; // Считаем, что проверяется экземпляр класса, участвующего в классификации ПО if (elementData.ClassifierID != null) { // ищем класс элемента среди элементов классификации ПО if (Context.SoftwareClassification.AllNodes.ContainsKey(elementData.ClassifierID)) { // получаем класс проверяемого элемента DPTreeNode <ElementData> classifierDataNode = Context.SoftwareClassification.AllNodes[elementData.ClassifierID]; // Проходимся от полученного элемента классификации вверх, Проверяем , не являются ли они требуемыми while (classifierDataNode != null) { // Сверяем if (classifierDataNode.Value._ElementID == softwareClassificationData._ElementID) { result = true; break; } classifierDataNode = classifierDataNode.Parent; // переходим к родителю } } } return(result); }
/// <summary> /// Функция конструирования дерева классификации ПО /// </summary> public void LoadSoftwareClassification() { DPTreeNode <ElementData> dpTreeNode = Context.SoftwareClassification; TreeNode node = new TreeNode(dpTreeNode.Value.DisplayName) { Tag = dpTreeNode.Value }; tvSoftwareClassification.Nodes.Add(node); SetTreeView(node, dpTreeNode.Children.ToList()); }
/// <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); }
/* * /// <summary> * /// Идентификатор текущей библиотеки * /// </summary> * private int _CurrentLibraryID; * public int CurrentLibraryID * { * get * { * return _CurrentLibraryID; * } * set * { * _CurrentLibraryID = value; * } * } */ /* * public ExecResult<Boolean> SetCurrentLibrary() * { * ExecResult<Boolean> result = new ExecResult<bool>(); * try * { * var selection = EARepository.GetTreeSelectedPackage(); * if (selection == null || !EAHelper.IsLibrary(selection.Element)) * { * throw new Exception("Не выделен библиотечный пакет"); * } * CurrentLibraryID = selection.PackageID; * result.message = "установлен ID библиотеки=" + CurrentLibraryID; * * * } * catch (Exception ex) * { * result.setException(ex); * } * * return result; * * } */ /// <summary> /// Размещает на диаграмме под элементом дерево компонентов, размещённых в нём /// </summary> /// <param name="onlyParent"></param> /// <returns></returns> public ExecResult <Boolean> PutChildrenDeployHierarchy(string location) { ExecResult <Boolean> result = new ExecResult <bool>(); ElementDesignerHelper.CallLevel = 0; try { EA.Element selectedElement = null; switch (location) { case "TreeView": throw new Exception("Доступно только для диаграммы"); case "Diagram": case "MainMenu": if ((EARepository.GetCurrentDiagram() == null) || (EARepository.GetCurrentDiagram() != null && EARepository.GetCurrentDiagram().DiagramID != CurrentDiagram.DiagramID)) { throw new Exception("Текущая диаграмма должны быть открыта"); } List <EA.Element> selectedElementList = EAHelper.GetSelectedLibElement_Diagram(); if (selectedElementList.Count == 0) { throw new Exception("На текщей диаграммме нет выделенных библиотечных элементов"); } selectedElement = selectedElementList[0]; break; } // Получаем дерево дочерних элементов контейнеров DPTreeNode <EA.Element> сhildrenDHierarchy = LibraryHelper.GetDeployChildrenHierarchy(selectedElement); // Для начала размещаем на диаграмме корневой элемент EA.DiagramObject rootDA = PutElementOnDiagram(selectedElement); // Проходимся по иерархии и размещаем элементы на диаграмме List <DPTreeNode <EA.Element> > currentLevelNodes = new List <DPTreeNode <EA.Element> >(); currentLevelNodes.Add(сhildrenDHierarchy); List <DPTreeNode <EA.Element> > childLevelNodes = сhildrenDHierarchy.Children.ToList <DPTreeNode <EA.Element> >(); Point levelStartPoint = new Point(rootDA.left, rootDA.bottom - DAConst.border); Point levelEndPoint = new Point(levelStartPoint.X, levelStartPoint.Y); while (childLevelNodes.Count > 0) { foreach (DPTreeNode <EA.Element> childLevelNode in childLevelNodes) { // Размещаем элемент на диаграмме EA.DiagramObject curDA = PutElementOnDiagram(childLevelNode.Value); // Подвигаем элемент на отведённым ему уровень EADOHelper.ApplyPointToDA(curDA, new Point(levelEndPoint.X, levelStartPoint.Y)); int newLevelRight = curDA.right + DAConst.border; int newLevelBottom = curDA.bottom < levelEndPoint.Y ? curDA.bottom : levelEndPoint.Y; levelEndPoint = new Point(newLevelRight, newLevelBottom); } // коллекционируем список узлов уровнем ниже List <DPTreeNode <EA.Element> > grandchildLevelNodes = new List <DPTreeNode <EA.Element> >(); foreach (DPTreeNode <EA.Element> childlevelNode in childLevelNodes) { grandchildLevelNodes.AddRange(childlevelNode.Children); } childLevelNodes = grandchildLevelNodes; // делаем список узлов уровнем ниже - текущим // смещаем координаты размещения следующего уровня компонентов levelStartPoint = new Point(levelStartPoint.X, levelEndPoint.Y - DAConst.border); levelEndPoint = new Point(levelStartPoint.X, levelStartPoint.Y - DAConst.border); } //CurrentDiagram.DiagramLinks.Refresh(); //DPAddin.LinkDesigner.SetLinkTypeVisibility(LinkType.Deploy, false); EARepository.ReloadDiagram(CurrentDiagram.DiagramID); } catch (Exception ex) { result.setException(ex); } 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); } }