public ExecResult <Boolean> PutElementOnDiagram() { ExecResult <Boolean> result = new ExecResult <bool>(); try { // Получаем текущий (библиотечный) элемент дерева EA.Element curElement = EARepository.GetTreeSelectedObject(); if (curElement == null || !LibraryHelper.IsLibrary(curElement)) { throw new Exception("Не выделен библиотечный элемент"); } // Помещаем элемент на диаграмму EA.DiagramObject diagramObject = PutElementOnDiagram(curElement); CurrentDiagram.DiagramLinks.Refresh(); Context.LinkDesigner.SetLinkTypeVisibility(LinkType.Deploy, false); EARepository.ReloadDiagram(CurrentDiagram.DiagramID); } catch (Exception ex) { result.setException(ex); } return(result); }
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="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> /// Функция возвращает размер элемента, соответствующий размеру элемента на библиотечной диаграмме /// </summary> /// <returns></returns> public static ExecResult <Size> GetElementSizeOnLibDiagram(EA.Element element) { ExecResult <Size> result = new ExecResult <Size>() { code = -1 }; try { // лезем от элемента вверх по дереву пакетов, пока не достигнем верха либо не достигнем пакета без тэга DP_Library после нахождения такого тэга EA.Package curPackage = EARepository.GetPackageByID(element.PackageID); bool foundPackageAfterDPLibrary = false; bool foundDPLibraryPackage = false; while (curPackage != null & !(foundPackageAfterDPLibrary)) { // Проходимся по диаграммам пакета foreach (EA.Diagram curDiagram in curPackage.Diagrams) { // ... В в диаграмме - по объектам foreach (EA.DiagramObject diagramObject in curDiagram.DiagramObjects) { // если объект на диаграмме - наш объект, то срисовываем его размеры как дефолтные if (diagramObject.ElementID == element.ElementID) { Size curSize = ElementDesignerHelper.GetSize(diagramObject); result.value = curSize; result.code = 0; return(result); } } if (curPackage.ParentID != 0) { curPackage = EARepository.GetPackageByID(curPackage.ParentID); } else { curPackage = null; } if (LibraryHelper.IsLibrary(curPackage.Element)) { foundDPLibraryPackage = true; } if (!LibraryHelper.IsLibrary(curPackage.Element) && foundDPLibraryPackage) { foundPackageAfterDPLibrary = true; } } } } catch (Exception ex) { result.setException(ex); } return(result); }
/// <summary> /// Проверяет, что указанный линк - Deploy линк /// </summary> /// <param name="connector"></param> /// <returns></returns> public static bool IsDeploymentLink(EA.Connector connector) { if (LibraryHelper.IsLibrary(connector) && connector.TaggedValues.GetByName(DAConst.DP_LinkTypeTag) != null && ((EA.ConnectorTag)connector.TaggedValues.GetByName(DAConst.DP_LinkTypeTag)).Value == LinkType.Deploy.ToString()) { return(true); } else { return(false); } }
/// <summary> /// Включает/выключает показ коннекторов указанного типа на диаграмме /// </summary> /// <param name="linkType"></param> /// <param name="visibility"></param> public void SetConnectorVisibility(LinkType linkType, bool visibility = true) { // проходимся по элементам диаграммы foreach (EA.DiagramObject diagramObject in CurrentDiagram.DiagramObjects) { // Получаем элемент EA.Element diagramElement = EARepository.GetElementByID(diagramObject.ElementID); // Получаем коннекторы элемента foreach (EA.Connector connector in diagramElement.Connectors) { // Получаем тип коннектора try { LinkType curLinkType = LTHelper.GetConnectorType(connector); if (linkType != curLinkType) { continue; } } catch (Exception ex) { Logger.OutA("Не удалось определить тип коннектора " + ex.StackTrace, new EA.Connector[] { connector }); continue; } // проверяем, что коннектор может быть потенциально показан на диаграмме, т.е, что оба его элемента на диаграмме EA.Element secondElement = EARepository.GetElementByID((connector.ClientID == diagramElement.ElementID) ? connector.SupplierID : connector.ClientID); EA.DiagramObject secondElementDA = CurrentDiagram.GetDiagramObjectByID(secondElement.ElementID, ""); if (secondElementDA == null) { continue; } // Теперь смотрим на настройки видимости коннектора if (LibraryHelper.IsLibrary(connector)) { LinkType connectorlinkType = LTHelper.GetConnectorType(connector); if (linkType == connectorlinkType) { EA.DiagramLink connectorLink = DiagramLinkHelper.GetDLForConnector(connector); if (connectorLink == null) { connectorLink = DiagramLinkHelper.CreateDiagramLink(connector); connectorLink.Update(); } DiagramLinkHelper.SetDiagramLinkVisibility(connectorLink, visibility); } } } } }
/// <summary> /// Возыращает список выделенных в дереве библиотечных элементов /// </summary> /// <returns></returns> public static List <EA.Element> GetSelectedLibElement_Tree() { List <EA.Element> result = new List <EA.Element>(); foreach (EA.Element curElement in EARepository.GetTreeSelectedElements()) { if (LibraryHelper.IsLibrary(curElement)) { result.Add(curElement); } } return(result); }
/// <summary> /// Возыращает список выделенных в диаграмме библиотечных элементов /// </summary> /// <returns></returns> public static List <EA.Element> GetSelectedLibElement_Diagram() { List <EA.Element> result = new List <EA.Element>(); foreach (EA.DiagramObject curDA in Context.CurrentDiagram.SelectedObjects) { EA.Element curElement = EARepository.GetElementByID(curDA.ElementID); if (LibraryHelper.IsLibrary(curElement)) { result.Add(curElement); } } 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); }
/// <summary> /// Возыращает список выделенных в диаграмме коннекторов /// </summary> /// <returns></returns> public static EA.Connector GetSelectedLibConnector_Diagram(bool checkISLibrary = true) { EA.Connector result = null; EA.Connector selectedConnector = Context.CurrentDiagram.SelectedConnector; if (selectedConnector != null) { if (!checkISLibrary) { result = selectedConnector; } else if (LibraryHelper.IsLibrary(selectedConnector)) { result = selectedConnector; } } return(result); }
/* * /// <summary> * /// Функция загружает список коннекторов из текущей библиотеки * /// </summary> * /// <returns></returns> * public static Dictionary<LinkType, Dictionary<string, List<ConnectorData>>> LoadConnectorData() * { * var result = new Dictionary<LinkType, Dictionary<string, List<ConnectorData>>>(); * IEqualityComparer<ConnectorData> ConnectorDataEqualityComparer = new IEqualityComparer_ConnectorData(); * * * foreach (LinkType linkType in Enum.GetValues(typeof(LinkType))) * { * result.Add(linkType, new Dictionary<string, List<ConnectorData>>()); * } * * // Получаем библиотеку * EA.Package libRoot = Context.CurrentLibrary; * if (libRoot == null) * throw new Exception("Не установлена библиотека"); * * // Ползём по библиотеке и добавляем найденные библиотечные коннекторы в коллекцию * List<EA.Package> curLibpackages = new List<EA.Package>(); * curLibpackages.Add(libRoot); * * while (curLibpackages.Count > 0) * { * List<EA.Package> nextLibpackages = new List<EA.Package>(); * * foreach (EA.Package curPackage in curLibpackages) * { * //EAHelper.Out("Checking package elements ", new EA.Package[] { curPackage }); * * foreach (EA.Element curElement in EAHelper.GetAllPackageElements(curPackage)) * { * //EAHelper.Out("Checking element connectors ", new EA.Element[] { curElement }); * * foreach (EA.Connector curConnector in curElement.Connectors) * { * * if (LibraryHelper.IsLibrary(curConnector)) * { * LinkType connectorLinkType = LTHelper.GetConnectorType(curConnector); * string connectorFlowID = EAHelper.GetTaggedValue(curConnector, DAConst.DP_FlowIDTag); * string connectorSegmentID = EAHelper.GetTaggedValue(curConnector, DAConst.DP_SegmentIDTag); * * if (!result[connectorLinkType].ContainsKey(connectorFlowID)) * result[connectorLinkType].Add(connectorFlowID, new List<ConnectorData>()); * * // Добавляем * ConnectorData connectorData = new ConnectorData(); * connectorData.Name = curConnector.Name; * connectorData._ConnectorID = curConnector.ConnectorID; * connectorData.Connector = curConnector; * connectorData.LinkType = connectorLinkType; * connectorData.FlowID = connectorFlowID; * connectorData.SegmentID = connectorSegmentID; * * connectorData.SourceElementID = curConnector.ClientID; * connectorData.TargetElementID = curConnector.SupplierID; * * if (!result[connectorLinkType][connectorFlowID].Contains(connectorData, ConnectorDataEqualityComparer)) * result[connectorLinkType][connectorFlowID].Add(connectorData); * } * * } * } * * foreach (EA.Package nextPackage in curPackage.Packages) * nextLibpackages.Add(nextPackage); * } * * curLibpackages = nextLibpackages; * } * * return result; * } */ /// <summary> /// Возвращает элементы, связанные с указанным заданной связью + находящиеся с указанного конца /// </summary> /// <param name="package"></param> /// <returns></returns> public static List <EA.Element> GetConnectedElements(EA.Element element, LinkType linkType, byte connectorEnd = 1 /*0=source 1=target*/) { List <EA.Element> result = new List <EA.Element>(); foreach (EA.Connector connector in element.Connectors) { if ((connectorEnd == 0 /*source*/ && connector.ClientID == element.ElementID) || connectorEnd == 1 /*source*/ && connector.SupplierID == element.ElementID) { continue; // не тем концом в другой элемент упирается } if (LibraryHelper.IsLibrary(connector) && LTHelper.GetConnectorType(connector) == linkType) { // если связь нужного типа EA.Element otherEndElement = EARepository.GetElementByID((connectorEnd == 0) ? connector.ClientID : connector.SupplierID); if (LibraryHelper.IsLibrary(otherEndElement)) { result.Add(otherEndElement); } } } return(result); }
/// <summary> /// Устанавливает видимость для нетипизированных коннекторов на диаграмме /// </summary> public void SetConnectorVisibility_Untyped(bool visibility = true) { // проходимся по элементам диаграммы foreach (EA.DiagramObject diagramObject in CurrentDiagram.DiagramObjects) { // Получаем элемент EA.Element diagramElement = EARepository.GetElementByID(diagramObject.ElementID); // Получаем коннекторы элемента foreach (EA.Connector connector in diagramElement.Connectors) { // Проверяем тип коннектора if (LibraryHelper.IsLibrary(connector)) { continue; } // проверяем, что коннектор может быть потенциально показан на диаграмме, т.е, что оба его элемента на диаграмме EA.Element secondElement = EARepository.GetElementByID((connector.ClientID == diagramElement.ElementID) ? connector.SupplierID : connector.ClientID); EA.DiagramObject secondElementDA = CurrentDiagram.GetDiagramObjectByID(secondElement.ElementID, ""); if (secondElementDA == null) { continue; } // Получаем линк коннектора на диаграмме EA.DiagramLink connectorLink = DiagramLinkHelper.GetDLForConnector(connector); if (connectorLink == null) { continue; } // Устанавливаем видимость DiagramLinkHelper.SetDiagramLinkVisibility(connectorLink, visibility); } } }
/// <summary> /// Функция устанавливает размер элемента по умолчанию, соответствующий размеру элемента на библиотечной диаграмме /// </summary> /// <returns></returns> public static ExecResult <Boolean> SetElementDefaultSize() { ExecResult <Boolean> result = new ExecResult <bool>(); try { var obj = EARepository.GetContextObject(); if (obj == null) { throw new Exception("Нет текущего объекта"); } if (!(obj is EA.Element) || !LibraryHelper.IsLibrary((EA.Element)obj)) { throw new Exception("Выделен не библиотечный элемент"); } EA.Element curElement = (EA.Element)obj; // Ищем размер на библиотечных диаграммах ExecResult <Size> GetElementSizeOnLibDiagramResult = GetElementSizeOnLibDiagram(curElement); if (GetElementSizeOnLibDiagramResult.code != 0) { throw new Exception(GetElementSizeOnLibDiagramResult.message); } EATVHelper.TaggedValueSet(curElement, DAConst.defaultWidthTag, GetElementSizeOnLibDiagramResult.value.Width.ToString()); EATVHelper.TaggedValueSet(curElement, DAConst.defaultHeightTag, GetElementSizeOnLibDiagramResult.value.Height.ToString()); Logger.Out("Найден элемент диаграммы для установки размеров " + GetElementSizeOnLibDiagramResult.value.Width.ToString() + "x" + GetElementSizeOnLibDiagramResult.value.Height.ToString()); } catch (Exception ex) { result.setException(ex); } return(result); }
public ExecResult <Boolean> CreateLink() { ExecResult <Boolean> result = new ExecResult <bool>(); Logger.Out(""); try { if (!Context.CheckCurrentDiagram()) { throw new Exception("Не установлена или не открыта текущая диаграмма"); } // На диаграмме должны быть выделены 2 (библиотечных) элемента var selectedObjects = CurrentDiagram.SelectedObjects; if (selectedObjects.Count != 2) { throw new Exception("Должно быть выделено 2 элемента"); } EA.DiagramObject firstDA = selectedObjects.GetAt(0); EA.Element firstElement = EARepository.GetElementByID(firstDA.ElementID); EA.DiagramObject secondDA = selectedObjects.GetAt(1); EA.Element secondElement = EARepository.GetElementByID(secondDA.ElementID); if (!LibraryHelper.IsLibrary(firstElement) || !LibraryHelper.IsLibrary(secondElement)) { throw new Exception("Должны быть выделены библиотечные элементы"); } Logger.Out("Выделенные элементы: ", new EA.Element[] { firstElement, secondElement }); // запускаем форму ExecResult <ConnectorData> createNewLinkData = FCreateNewLink.Execute(firstDA, secondDA); if (createNewLinkData.code != 0) { return(result); } // надо проверить, нет ли уже такого линка между элементами foreach (EA.Connector connector in firstElement.Connectors) { if (connector.ClientID == secondElement.ElementID || connector.SupplierID == secondElement.ElementID) { if (LibraryHelper.IsLibrary(connector)) { LinkType connectorLinkType = LTHelper.GetConnectorType(connector); if (createNewLinkData.value.LinkType == connectorLinkType) { if (EATVHelper.GetTaggedValue(connector, DAConst.DP_FlowIDTag) == createNewLinkData.value.FlowID && EATVHelper.GetTaggedValue(connector, DAConst.DP_SegmentIDTag) == createNewLinkData.value.SegmentID) { throw new Exception("Запрашиваемая связь уже существует"); } } } } } // Создаём EA.Connector newConnector = ConnectorHelper.CreateConnector(createNewLinkData.value, true); CurrentDiagram.DiagramLinks.Refresh(); EARepository.ReloadDiagram(CurrentDiagram.DiagramID); Logger.Out("Создан ", new EA.Connector[] { newConnector }); } catch (Exception ex) { result.setException(ex); } return(result); }