/// <summary> /// Вычисляет (предлагаемый) ID инфопотока, исходящего из элемента /// </summary> /// <param name="element"></param> /// <returns></returns> public static string SuggestFlowIDName(EA.Element element) { string result = ""; string flowID = EATVHelper.GetTaggedValue(element, DAConst.DP_NameForFlowIDTag, false); // от данного элемента лезем вверх по его свзям SoftwareClassification и склеиваем тэги DP_NameForFlowID List <EA.Element> connectedElements = ConnectorHelper.GetConnectedElements(element, LinkType.SoftwareClassification, 1); // если у элемента нет таких зависимостей, но есть классификатор - ищем зависимости у классификатора if (connectedElements.Count == 0) { if (element.ClassifierID != 0) { flowID = EATVHelper.GetTaggedValue(element, DAConst.DP_NameForFlowIDTag, false); connectedElements = ConnectorHelper.GetConnectedElements(EARepository.GetElementByID(element.ClassifierID), LinkType.SoftwareClassification, 1); } } while (connectedElements.Count > 0) { string nextname = EATVHelper.GetTaggedValue(connectedElements[0], DAConst.DP_NameForFlowIDTag, false); if (nextname != "") { if (flowID == "") { flowID = nextname; } else { flowID = nextname + "." + flowID; } } connectedElements = ConnectorHelper.GetConnectedElements(connectedElements[0], LinkType.SoftwareClassification, 1); } // Теперь ищем подбираем номер int segmentNumber = 1; string flowIDWithNumber = flowID + " " + segmentNumber.ToString(); throw new NotImplementedException(); /* * while (Context.ConnectorData[LinkType.SoftwareClassification].ContainsKey(flowIDWithNumber)) * { * segmentNumber++; * flowIDWithNumber = flowID + " " + segmentNumber.ToString(); * } */ result = flowIDWithNumber; 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> /// Функция обновляет данные коннектора пор данным переданного ConnectorData /// </summary> /// <param name="connectorData"></param> public static void UpdateConnectorByData(ConnectorData connectorData) { EA.Connector connector = connectorData.Connector; connector.Name = connectorData.Name; connector.Notes = connectorData.Notes; connector.ClientID = connectorData.SourceElementID; connector.SupplierID = connectorData.TargetElementID; connector.Update(); if (connectorData.IsLibrary) { EATVHelper.TaggedValueSet(connector, DAConst.DP_LibraryTag, ""); EATVHelper.TaggedValueSet(connector, DAConst.DP_LinkTypeTag, connectorData.LinkType.ToString()); EATVHelper.TaggedValueSet(connector, DAConst.DP_FlowIDTag, connectorData.FlowID); EATVHelper.TaggedValueSet(connector, DAConst.DP_SegmentIDTag, connectorData.SegmentID); } Context.ConnectorData[connectorData.ConnectorID] = connectorData; }
/// <summary> /// Функция вычисляет размеры элемента по умолчанию, если они нулевые /// Если есть настройки размера в элементе - используются настройки в элементе /// Если нет - используются общие дефолтные константы /// </summary> /// <param name="da"></param> /// <returns>размер объекта</returns> public static Size GetDefaultDASize(EA.DiagramObject diagramObject) { Size result = new Size(diagramObject.right - diagramObject.left, diagramObject.top - diagramObject.bottom); EA.Element element = EARepository.GetElementByID(diagramObject.ElementID); // Для начала пытаемся установить размер из тэгов if (result.Width == 0 && EATVHelper.GetTaggedValues(element).GetByName(DAConst.defaultWidthTag) != null) { result.Width = int.Parse(EATVHelper.GetTaggedValues(element).GetByName(DAConst.defaultWidthTag).Value); } if (result.Height == 0 && EATVHelper.GetTaggedValues(element).GetByName(DAConst.defaultHeightTag) != null) { result.Height = int.Parse(EATVHelper.GetTaggedValues(element).GetByName(DAConst.defaultHeightTag).Value); } // Если из тэгов не установили, пытаемся вычислить на лету по библиотечной диаграмме /* * if (result.Height == 0 || result.Width == 0) * { * ExecResult<Size> GetElementSizeOnLibDiagramResult = EAHelper.GetElementSizeOnLibDiagram(element); * if (GetElementSizeOnLibDiagramResult.code == 0) * { * result = GetElementSizeOnLibDiagramResult.value; * } * } */ // Ну если совсем ничего, то просто ставим цифры по умолчанию if (result.Height == 0) { result.Height = DAConst.defaultHeight; } if (result.Width == 0) { result.Width = DAConst.defaultWidth; } return(result); }
/// <summary> /// Проверяет, что элемент является библиотечным. Если это инстанс, проверяет также класс /// </summary> /// <param name="element"></param> /// <returns></returns> public static bool IsLibrary(EA.Element element) { bool result = false; if (element.Type != "DeploymentSpecification") { EA.Collection taggedValues = EATVHelper.GetTaggedValues(element); try { if (taggedValues != null && taggedValues.GetByName(DAConst.DP_LibraryTag) != null) { result = true; } } catch { result = false; // ибо обращение к несуществующему тэгу раизит ошибку, а проверить наличие можно только перебором тэгов, что неудобно } } return(result); }
/// <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); }
/// <summary> /// Установка Tags для выделенных элементов /// </summary> /// <returns></returns> public ExecResult <Boolean> SetElementTags(string location) { ExecResult <Boolean> result = new ExecResult <bool>(); try { // Сначала получаем список выделеннеых библиотечных элементов List <EA.Element> selectedLibElements = new List <EA.Element>(); switch (location) { case "TreeView": selectedLibElements = EAHelper.GetSelectedLibElement_Tree(); break; case "Diagram": if (!Context.CheckCurrentDiagram()) { throw new Exception("Не установлена или не открыта текущая диаграмма"); } selectedLibElements = EAHelper.GetSelectedLibElement_Diagram(); break; case "MainMenu": if (CurrentDiagram != null) { if (Context.CheckCurrentDiagram()) { selectedLibElements = EAHelper.GetSelectedLibElement_Diagram(); } else { selectedLibElements = EAHelper.GetSelectedLibElement_Tree(); } } else { selectedLibElements = EAHelper.GetSelectedLibElement_Tree(); } break; } if (selectedLibElements.Count == 0) // если не выделены элементы - пытаемся найти выделенные коннекторы { if (location == "Diagram" || location == "MainMenu") { EA.Connector selectedConnector = EAHelper.GetSelectedLibConnector_Diagram(); if (selectedConnector != null) { return(Context.LinkDesigner.SetConnectorTags(location)); } } else { throw new Exception("Не выделены библиотечные элементы"); } } // Конструируем данные тэгов для формы List <TagData> curTagDataList = new List <TagData>(); foreach (EA.Element curElement in selectedLibElements) { foreach (EA.TaggedValue taggedValue in curElement.TaggedValuesEx) { string tagName = taggedValue.Name; TagData curTagData; curTagData = curTagDataList.FirstOrDefault(item => (item.TagName == tagName)); if (curTagData == null) { curTagData = new TagData() { TagName = tagName, TagValue = taggedValue.Value }; curTagDataList.Add(curTagData); } curTagData.TagState = true; curTagData.Count++; if (taggedValue.ElementID != curElement.ElementID) { curTagData.Ex = true; } } } // Открываем форму для установки Tags ExecResult <List <TagData> > setTagsResult = new FSetTags().Execute(curTagDataList); if (setTagsResult.code != 0) { return(result); } // Прописываем в элементах что наустанавливали на форме foreach (EA.Element curElement in selectedLibElements) { foreach (TagData curTagData in setTagsResult.value) { if (curTagData.Enabled) // записываем только для Tags, в котоорые разрешено { if (curTagData.TagState == false) { EATVHelper.TaggedValueRemove(curElement, curTagData.TagName); } else { EATVHelper.TaggedValueSet(curElement, curTagData.TagName, curTagData.TagValue); } } } } } catch (Exception ex) { result.setException(ex); } return(result); }
public static EA.Connector CreateConnector(ConnectorData createNewLinkData, bool putOnDiagram = true) { EA.Connector newConnector = null; EA.Element firstElement = EARepository.GetElementByID(createNewLinkData.SourceElementID); EA.Element secondElement = EARepository.GetElementByID(createNewLinkData.TargetElementID); // Определяем тип создаваемого коннектора string creatingConnectorType; switch (createNewLinkData.LinkType) { case LinkType.Communication: case LinkType.Deploy: creatingConnectorType = "Dependency"; break; case LinkType.InformationFlow: creatingConnectorType = "InformationFlow"; break; case LinkType.SoftwareClassification: creatingConnectorType = "Generalization"; break; default: throw new Exception("Непредусмотренный тип коннектора при создании"); } // Создаём newConnector = firstElement.Connectors.AddNew("", creatingConnectorType); if (createNewLinkData.LinkType == LinkType.InformationFlow || createNewLinkData.LinkType == LinkType.Deploy) { newConnector.Direction = "Source -> Destination"; } else { newConnector.Direction = "Unspecified"; } newConnector.ClientID = firstElement.ElementID; newConnector.SupplierID = secondElement.ElementID; newConnector.Name = createNewLinkData.Name; newConnector.Notes = createNewLinkData.Notes; newConnector.Update(); EATVHelper.TaggedValueSet(newConnector, DAConst.DP_LibraryTag, ""); EATVHelper.TaggedValueSet(newConnector, DAConst.DP_LinkTypeTag, Enum.GetName(typeof(LinkType), createNewLinkData.LinkType)); EATVHelper.TaggedValueSet(newConnector, DAConst.DP_FlowIDTag, createNewLinkData.FlowID); EATVHelper.TaggedValueSet(newConnector, DAConst.DP_SegmentIDTag, createNewLinkData.SegmentID); //EAHelper.TaggedValueSet(newConnector, DAConst.DP_TempLinkTag, createNewLinkData.tempLink.ToString()); //EAHelper.TaggedValueSet(newConnector, DAConst.DP_TempLinkDiagramIDTag, createNewLinkData.tempLink ? createNewLinkData.tempLinkDiagramID : ""); newConnector.Update(); newConnector.TaggedValues.Refresh(); // Добавляем коннектор к кэш информации о коннекторах createNewLinkData.ConnectorID = newConnector.ConnectorID; Context.ConnectorData.Add(createNewLinkData.ConnectorID, createNewLinkData); if (putOnDiagram) { // Помещаем на диаграмму EA.DiagramLink diagramLink = DiagramLinkHelper.CreateDiagramLink(newConnector); } return(newConnector); }
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); }
/// <summary> /// Установка Tags для выделеного коннектора и других видимых на диаграмме линков того же типа /// </summary> /// <returns></returns> public ExecResult <Boolean> SetSimilarLinksTags(string location) { ExecResult <Boolean> result = new ExecResult <bool>(); try { // Сначала получаем список выделеннеых библиотечных элементов EA.Connector selectedConnector = EAHelper.GetSelectedLibConnector_Diagram(); if (selectedConnector == null) { throw new Exception("Не выделены библиотечные элементы"); } // Создаём список коннекторов и добавляем к нему выделенный List <EA.Connector> connectorList = new List <EA.Connector>(); // Ищем на диаграмме другие линки такого же типа foreach (EA.DiagramLink curDL in CurrentDiagram.DiagramLinks) { EA.Connector curConnector = EARepository.GetConnectorByID(curDL.ConnectorID); if (!curDL.IsHidden && curConnector.Type == selectedConnector.Type) { connectorList.Add(curConnector); } } // Конструируем данные тэгов для формы List <TagData> curTagDataList = new List <TagData>(); foreach (EA.Connector connector in connectorList) { foreach (EA.ConnectorTag taggedValue in selectedConnector.TaggedValues) { string tagName = taggedValue.Name; TagData curTagData; curTagData = curTagDataList.FirstOrDefault(item => (item.TagName == tagName)); if (curTagData == null) { curTagData = new TagData() { TagName = tagName, TagValue = taggedValue.Value }; curTagDataList.Add(curTagData); } curTagData.TagState = true; curTagData.Ex = false; curTagData.Count++; } } // Открываем форму для установки Tags ExecResult <List <TagData> > setTagsResult = new FSetTags().Execute(curTagDataList); if (setTagsResult.code != 0) { return(result); } // Прописываем в элементах что наустанавливали на форме foreach (EA.Connector connector in connectorList) { foreach (TagData curTagData in setTagsResult.value) { if (curTagData.Enabled) // записываем только для Tags, в котоорые разрешено { if (curTagData.TagState == false) { EATVHelper.TaggedValueRemove(connector, curTagData.TagName); } else { EATVHelper.TaggedValueSet(connector, curTagData.TagName, curTagData.TagValue); } } } } } catch (Exception ex) { result.setException(ex); } return(result); }
/// <summary> /// Установка Tags для выделенного коннектора /// </summary> /// <returns></returns> public ExecResult <Boolean> SetConnectorTags(string location) { if (!Context.CheckCurrentDiagram()) { throw new Exception("Не установлена или не открыта текущая диаграмма"); } ExecResult <Boolean> result = new ExecResult <bool>(); try { // Сначала получаем список выделеннеых библиотечных элементов EA.Connector selectedConnector = EAHelper.GetSelectedLibConnector_Diagram(false); if (selectedConnector == null) { throw new Exception("Не выделены библиотечные элементы"); } // Конструируем данные тэгов для формы List <TagData> curTagDataList = new List <TagData>(); foreach (EA.ConnectorTag taggedValue in selectedConnector.TaggedValues) { string tagName = taggedValue.Name; TagData curTagData = new TagData() { TagName = tagName, TagValue = taggedValue.Value }; curTagData.TagState = true; curTagData.Ex = false; curTagData.Count = 1; curTagDataList.Add(curTagData); } // Открываем форму для установки Tags ExecResult <List <TagData> > setTagsResult = new FSetTags().Execute(curTagDataList); if (setTagsResult.code != 0) { return(result); } // Прописываем в элементах что наустанавливали на форме foreach (TagData curTagData in setTagsResult.value) { if (curTagData.Enabled) // записываем только для Tags, в котоорые разрешено { if (curTagData.TagState == false) { EATVHelper.TaggedValueRemove(selectedConnector, curTagData.TagName); } else { EATVHelper.TaggedValueSet(selectedConnector, curTagData.TagName, curTagData.TagValue); } } } } catch (Exception ex) { result.setException(ex); } return(result); }
/// /// Called when user makes a selection in the menu. /// This is your main exit point to the rest of your Add-in /// /// <param name="Repository" />the repository /// <param name="Location" />the location of the menu /// <param name="MenuName" />the name of the menu /// <param name="ItemName" />the name of the selected menu item public void EA_MenuClick(EA.Repository repository, string location, string menuName, string itemName) { switch (itemName) { // ------ DESIGN -------------------------------------------------------------- case menuPutLibElementOnDiagram: var putLibElementResult = Context.Designer.PutElementOnDiagram(); OutExecResult(putLibElementResult); break; case menuPutContourContour: var putContourContourResult = Context.Designer.PutContourContourOnDiagram(location); OutExecResult(putContourContourResult); break; case menuPutParentDHierarchyOnDiagram: var putDeploymentHierarchyResult = Context.Designer.PutParentHierarchyOnDiagram(); OutExecResult(putDeploymentHierarchyResult); break; case menuPutChildrenDHierarchyOnDiagram: var putPutCDHResult = Context.Designer.PutChildrenDHierarchyOnDiagram(); OutExecResult(putPutCDHResult); break; case menuPutChildrenDeployHierarchy: var putChildrenDeployHierarchyResult = Context.Designer.PutChildrenDeployHierarchy(location); OutExecResult(putChildrenDeployHierarchyResult); break; case menuSetElementTags: var setElementTagsResult = Context.Designer.SetElementTags(location); OutExecResult(setElementTagsResult); break; // ------ DESIGN LINKS -------------------------------------------------------------- case menuCreateLink: var createCommunicationResult = Context.LinkDesigner.CreateLink(); OutExecResult(createCommunicationResult); break; case menuManageLinks: var ManageLinksResult = Context.LinkDesigner.ManageLinks(); OutExecResult(ManageLinksResult); break; case menuManageLinkVisibility: var ManageLinkVisibilityResult = Context.LinkDesigner.ManageLinkVisibility(); OutExecResult(ManageLinkVisibilityResult); break; case menuSetConnectorTags: var setConnectorTagsResult = Context.LinkDesigner.SetConnectorTags(location); OutExecResult(setConnectorTagsResult); break; case menuSetSimilarLinksTags: var setSimilarLinksTags = Context.LinkDesigner.SetSimilarLinksTags(location); OutExecResult(setSimilarLinksTags); break; // ------ UTILS -------------------------------------------------------------- case menuSetCurrentDiagram: Context.CurrentDiagram = Context.EARepository.GetCurrentDiagram(); Logger.Out("Установлена текущая диаграмма = " + Context.CurrentDiagram.Name); break; case menuSetCurrentLibrary: var setCurrentLibraryResult = LibraryHelper.SetCurrentLibrary(location); OutExecResult(setCurrentLibraryResult); break; case menuSetDPLibratyTag: var setDPLibratyTagResult = EATVHelper.SetDPLibratyTag(location); OutExecResult(setDPLibratyTagResult); break; case menuReloadConnectorData: Context.ConnectorData = null; Logger.Out("Сброшены данные коннекторов"); break; case menuDoOnConnectActions: Addin_OnConnectActions(); break; case menuRunSQLQuery: var fRunSQLQueryResult = FRunSQLQuery.Execute(); OutExecResult(fRunSQLQueryResult); break; // --------- REPORTS ------------------------------------------------------------ case menuDiagramElementsReport: var fDiagramElementsReportResult = ReportsHelper.DiagramElementsReport(location); OutExecResult(fDiagramElementsReportResult); break; // ------ EXPORT -------------------------------------------------------------- case menuExportDiagram: var exportResult = DiagramExporter.Export(location); break; // ------ TEST -------------------------------------------------------------- case menuTest1: var test1Result = Test1(); OutExecResult(test1Result); break; case menuTest2: var test2Result = Test2(); OutExecResult(test2Result); break; case menuTest3: var test3Result = Test3(); OutExecResult(test3Result); break; } }