Пример #1
0
        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);
        }
Пример #2
0
        /// <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());
        }
Пример #4
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);
        }
Пример #5
0
        /*
         * /// <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);
        }
Пример #6
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);
            }
        }