/// <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); } } } } }
public ConnectorData(EA.Connector connector) { Connector = connector; Name = Connector.Name; Notes = Connector.Notes; LinkType = LTHelper.GetConnectorType(connector); FlowID = EATVHelper.GetTaggedValue(connector, DAConst.DP_FlowIDTag); SegmentID = EATVHelper.GetTaggedValue(connector, DAConst.DP_SegmentIDTag); SourceElementID = connector.ClientID; TargetElementID = connector.SupplierID; }
public ConnectorData(EA.DiagramLink diagramLink) : base() { ConnectorID = diagramLink.ConnectorID; Name = Connector.Name; Notes = Connector.Notes; LinkType = LTHelper.GetConnectorType(Connector); FlowID = EATVHelper.GetTaggedValue(Connector, DAConst.DP_FlowIDTag); SegmentID = EATVHelper.GetTaggedValue(Connector, DAConst.DP_SegmentIDTag); SourceElementID = Connector.ClientID; TargetElementID = Connector.SupplierID; }
/// <summary> /// Функция возвращает название ПО, которому принадлежит элемент /// </summary> /// <param name="element"></param> /// <returns></returns> public static string GetElementSoftwareName(EA.Element element) { string result = ""; // пока тупо взвращаем ПО верхнего уровня // сначала пооучаем классификатор if (element.ClassifierID != 0) { EA.Element classifier = EARepository.GetElementByID(element.ClassifierID); // проверяем наличие связи SoftwareClassifier foreach (EA.Connector connector in classifier.Connectors) { if (LTHelper.GetConnectorType(connector) == LinkType.SoftwareClassification && connector.ClientEnd == classifier) { result = classifier.Name; // есть такая связь - ползём по связям по дереву вверх // пока "сверху" есть следующий элемент, присваиваем результату имя текущего элемента EA.Connector curConnector = connector; while (curConnector != null) { EA.Element parent = EARepository.GetElementByID(curConnector.SupplierID); EA.Connector nextConnector = null; foreach (EA.Connector parentConnector in classifier.Connectors) { if (LTHelper.GetConnectorType(connector) == LinkType.SoftwareClassification && connector.ClientEnd == classifier) { nextConnector = parentConnector; break; } } if (nextConnector != null) { result = parent.Name; } curConnector = nextConnector; } } } } return(result); }
/// <summary> /// Устанавливает видимость указанного типа коннекторов на диаграммме /// </summary> public void SetLinkTypeVisibility(LinkType LinkType, bool visibility = true) { foreach (EA.DiagramLink diagramLink in Context.CurrentDiagram.DiagramLinks) { EA.Connector connector = Context.EARepository.GetConnectorByID(diagramLink.ConnectorID); LinkType connectorLinkType = LTHelper.GetConnectorType(connector); switch (LinkType) { case LinkType.Deploy: if (connectorLinkType == LinkType.Deploy) { DiagramLinkHelper.SetDiagramLinkVisibility(diagramLink, visibility); } break; } } }
/* * /// <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); }
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); }