/// <summary> /// Вспомогательная функция определяет, предназанчен ли библиотечный элемнет для размещения на диаграмме /// Правила: Контуры = разрешён Classifier, остальные компоненты - только Instance /// </summary> /// <param name=""></param> /// <returns></returns> public static bool AppropriateForDiagram(EA.Element element) { bool result = false; ComponentLevel componentLevel = CLHelper.GetComponentLevel(element); switch (componentLevel) { case ComponentLevel.SystemContour: case ComponentLevel.ContourContour: result = true; break; case ComponentLevel.SystemComponent: case ComponentLevel.ContourComponent: case ComponentLevel.Node: case ComponentLevel.Device: case ComponentLevel.ExecutionEnv: case ComponentLevel.Component: result = element.ClassfierID != 0; break; } return(result); }
public ElementData(EA.Element element) { _ElementID = element.ElementID; Name = element.Name; EAType = element.Type; if (element.ClassifierID != 0) { ClassifierID = element.ClassifierID; EA.Element classifier = Context.EARepository.GetElementByID((int)ClassifierID); ClassifierName = classifier.Name; ClassifierEAType = classifier.Type; } IsLibrary = LibraryHelper.IsLibrary(element); if (IsLibrary) { ComponentLevel = CLHelper.GetComponentLevel(element); string ngTag = EATVHelper.GetTaggedValue(element, DAConst.DP_NodeGroupsTag); if (ngTag != null) { NodeGroups = ngTag.Split(','); } } }
/// <summary> /// Размещает на диаграмме укзаанный элемент и иерархию его контейнеров /// </summary> /// <param name="onlyParent"></param> /// <returns></returns> public ExecResult <Boolean> PutParentHierarchyOnDiagram(bool onlyParent = false) { ExecResult <Boolean> result = new ExecResult <bool>(); ElementDesignerHelper.CallLevel = 0; try { ExecResult <List <ComponentLevel> > displayLevelsResult = FSelectComponentLevels.Execute(); if (displayLevelsResult.code != 0) { return(result); } // Получаем текущий (библиотечный) элемент дерева EA.Element curElement = EARepository.GetTreeSelectedObject(); Logger.Out("элемент:", new EA.Element[] { curElement }); if (curElement == null || !LibraryHelper.IsLibrary(curElement)) { throw new Exception("Не выделен библиотечный элемент"); } // Получаем цепочку родительских контейнеров List <EA.Element> deployments = LibraryHelper.GetParentHierarchy(curElement); Logger.Out("цепочка deploy-родителей:", deployments.ToArray()); // Размещаем на диаграмме элемент PutElementOnDiagram(curElement); // Проходимся по иерархии и размещаем элементы на диаграмме EA.Element prevElement = null; for (int i = 0; i < deployments.Count; i++) { // размещает только элементы выбранных уровней ComponentLevel componentLevel = CLHelper.GetComponentLevel(deployments[i]); if (!displayLevelsResult.value.Contains(componentLevel)) { continue; } EA.DiagramObject diagramObject = PutElementOnDiagram(deployments[i]); //diagramObject.Sequence = 1000 - (deployments.Count + i); // Это надо нормально сделать diagramObject.Update(); prevElement = deployments[i]; } CurrentDiagram.DiagramLinks.Refresh(); Context.LinkDesigner.SetLinkTypeVisibility(LinkType.Deploy, false); EARepository.ReloadDiagram(CurrentDiagram.DiagramID); } catch (Exception ex) { result.setException(ex); } return(result); }
/// <summary> /// Размещает на диаграмме укзаанный элемент и иерархию его контейнеров /// </summary> /// <param name="onlyParent"></param> /// <returns></returns> public ExecResult <Boolean> PutChildrenDHierarchyOnDiagram() { ExecResult <Boolean> result = new ExecResult <bool>(); ElementDesignerHelper.CallLevel = 0; try { ExecResult <List <ComponentLevel> > displayLevelsResult = FSelectComponentLevels.Execute(); if (displayLevelsResult.code != 0) { return(result); } // Получаем текущий (библиотечный) элемент дерева EA.Element curElement = null; if (EARepository.GetTreeSelectedElements().Count > 0) { curElement = EARepository.GetTreeSelectedElements().GetAt(0); } Logger.Out("элемент:", new EA.Element[] { curElement }); if (curElement == null || !LibraryHelper.IsLibrary(curElement)) { throw new Exception("Не выделен библиотечный элемент"); } // Получаем список дочерних элементов контейнеров List <EA.Element> сhildrenDHierarchy = LibraryHelper.GetChildHierarchy(curElement); // Размещаем на диаграмме элемент PutElementOnDiagram(curElement); // Проходимся по иерархии и размещаем элементы на диаграмме for (int i = 0; i < сhildrenDHierarchy.Count; i++) { // размещает только элементы выбранных уровней ComponentLevel componentLevel = CLHelper.GetComponentLevel(сhildrenDHierarchy[i]); if (!displayLevelsResult.value.Contains(componentLevel)) { continue; } // Размещаем элемент EA.DiagramObject diagramObject = PutElementOnDiagram(сhildrenDHierarchy[i]); diagramObject.Update(); } CurrentDiagram.DiagramLinks.Refresh(); Context.LinkDesigner.SetLinkTypeVisibility(LinkType.Deploy, false); EARepository.ReloadDiagram(CurrentDiagram.DiagramID); } catch (Exception ex) { result.setException(ex); } return(result); }
/// <summary> /// Функция возвращает список данных элементов библиотеки, соответствующих переданному уровню /// Даные возвращаются в формате NodeData /// </summary> /// <param name="clList"></param> public static List <NodeData> GetNodeData(List <ComponentLevel> clList, bool onlyAppropriateForDiagram = true) { List <NodeData> result = new List <NodeData>(); EA.Package LibRoot = Context.CurrentLibrary; List <EA.Package> curLevelPackages = new List <EA.Package>(); curLevelPackages.Add(LibRoot); // Последовательно проходимся по уровням дерева пакетов while (curLevelPackages.Count > 0) { List <EA.Package> nextLevelPackages = new List <EA.Package>(); // список пакетов для перехода на следующий уровень foreach (EA.Package curPackage in curLevelPackages) { // Выбираем из списка пакетов текущего уровня требуемые элементы foreach (EA.Element curElement in curPackage.Elements) { if (IsLibrary(curElement) && clList.Contains(CLHelper.GetComponentLevel(curElement)) && (onlyAppropriateForDiagram ? AppropriateForDiagram(curElement) : true)) { NodeData nodeData = new NodeData(); nodeData.Element = curElement; nodeData.ComponentLevel = CLHelper.GetComponentLevel(curElement); nodeData.Contour = GetElementContour(curElement); nodeData.GroupNames = EATVHelper.GetTaggedValue(curElement, DAConst.DP_NodeGroupsTag).Split(','); result.Add(nodeData); } } // строим список пакетов для перехода на следующий уровень foreach (EA.Package nextPackage in curPackage.Packages) { nextLevelPackages.Add(nextPackage); } } curLevelPackages = nextLevelPackages; } return(result); }
/// <summary> /// Возвращает, если есть, название (ближайшего) контура, в который включен компонент /// </summary> /// <param name="curElement"></param> /// <returns></returns> public static EA.Element GetElementContour(EA.Element curElement) { EA.Element result = null; List <EA.Element> parentDeployHierrchy = GetParentHierarchy(curElement); foreach (EA.Element curParent in parentDeployHierrchy) { if (LibraryHelper.IsLibrary(curParent) && new ComponentLevel[] { ComponentLevel.ContourComponent, ComponentLevel.ContourContour }.Contains(CLHelper.GetComponentLevel(curParent))) { result = curParent; break; } } return(result); }