/// <summary> /// Фунция возвращает DA, в который непосредственно вставлен указанный DA /// Вставленные это: /// - С границами внутри указанного /// - С Z-Order "выше" указанного /// - Которые не могут быть названными вставленными другими da с Z-Order "выше" указанного /// /// </summary> /// <param name="da"></param> /// <returns></returns> public static EA.DiagramObject GetContainerOfDA(EA.DiagramObject da) { EA.DiagramObject result = null; // Сначала проходимся по элементам диаграммы и смотрим кто укладывается в рамки и Z-order foreach (EA.DiagramObject curDA in Context.Designer.CurrentDiagram.DiagramObjects) { if (curDA.ElementID == da.ElementID) { continue; } if (ElementDesignerHelper.DAFitInside(da, curDA) && da.Sequence < curDA.Sequence) { if (result == null) { result = curDA; } else { if (result.Sequence < curDA.Sequence) // если уже кого то отобрали, то новый становится "папой" только если у него больше Zorder { result = curDA; } } } } 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> /// Функция передвигает DA по указанному вектору (т.е. смещает на размеры точки) /// </summary> /// <param name="diagramObject"></param> /// <param name="newStart"></param> /// <param name="doUpdate"></param> public static void ApplyVectorToDA(EA.DiagramObject diagramObject, Point vector, bool doUpdate = true) { Size diagramObjectSize = ElementDesignerHelper.GetSize(diagramObject); diagramObject.left += vector.X; diagramObject.right += vector.X; diagramObject.top += vector.Y; diagramObject.bottom += vector.Y; if (doUpdate) { diagramObject.Update(); } }
/// <summary> /// Функция передвигает DA в указанную точку /// </summary> /// <param name="diagramObject"></param> /// <param name="newStart"></param> /// <param name="doUpdate"></param> public static void ApplyPointToDA(EA.DiagramObject diagramObject, Point newStart, bool doUpdate = true) { Size diagramObjectSize = ElementDesignerHelper.GetSize(diagramObject); diagramObject.left = newStart.X; diagramObject.right = diagramObject.left + diagramObjectSize.Width; diagramObject.top = newStart.Y; diagramObject.bottom = diagramObject.top - diagramObjectSize.Height; if (doUpdate) { diagramObject.Update(); } }
/// <summary> /// Фунция возвращает список непосредственных вставленных DA для указанного /// Вставленные это: /// - С границами внутри указанного /// - С Z-Order "выше" указанного /// - Которые не могут быть названными вставленными другими da с Z-Order "выше" указанного /// /// </summary> /// <param name="da"></param> /// <returns></returns> public static List <EA.DiagramObject> GetContainedForDA(EA.DiagramObject da) { List <EA.DiagramObject> result = new List <EA.DiagramObject>(); // Сначала проходимся по элементам диаграммы и смотрим кто укладывается в рамки и Z-order foreach (EA.DiagramObject curDA in Context.Designer.CurrentDiagram.DiagramObjects) { if (curDA.ElementID == da.ElementID) { continue; } // если такой элемент есть, проходимся по элементам даграммы ещё раз и смотрим, // не может ли он принадлежать ещё кому-то с меньшим Z-order if (ElementDesignerHelper.DAFitInside(curDA, da) && da.Sequence > curDA.Sequence) { bool hasAnotherParent = false; foreach (EA.DiagramObject curDA1 in Context.Designer.CurrentDiagram.DiagramObjects) { if (curDA1.ElementID == da.ElementID) { continue; } if (ElementDesignerHelper.DAFitInside(curDA, curDA1) && curDA1.Sequence < da.Sequence) { hasAnotherParent = true; break; } } if (!hasAnotherParent) { result.Add(curDA); } } else { //EAHelper.Out("Не Укладывается в рамки и Zorder: ", new EA.DiagramObject[] { curDA }); } } return(result); }
/// <summary> /// Функция добавляет или замещает элемент на диаграмме, если указано - внутри указанного элемента /// </summary> /// <param name="element"></param> /// <param name="parentElement"></param> public EA.DiagramObject PutElementOnDiagram(EA.Element element) { ElementDesignerHelper.CallLevel++; EA.DiagramObject elementDA; try { Logger.Out(element.Name); Logger.Out("размещаем элемент ", new EA.Element[] { element }); var diagramObjects = CurrentDiagram.DiagramObjects; elementDA = CurrentDiagram.GetDiagramObjectByID(element.ElementID, ""); // Получаем элемент на диаграмме if (elementDA == null) // если элемента нет - создаём { Logger.Out("элемента нет на диаграмме, создаём "); elementDA = CurrentDiagram.DiagramObjects.AddNew("", ""); elementDA.ElementID = element.ElementID; // устанавливаем размер объекта Size elementSize = ElementDesignerHelper.GetDefaultDASize(elementDA); EADOHelper.ApplySizeToDA(elementDA, elementSize, false); int elementID = elementDA.ElementID; Point newDAPoint = ElementDesignerHelper.GetFirstFreePoinForDA(elementDA); EADOHelper.ApplyPointToDA(elementDA, newDAPoint, false); elementDA.Update(); CurrentDiagram.Update(); CurrentDiagram.DiagramObjects.Refresh(); Logger.Out(element.Name + ":создан элемент ", new EA.DiagramObject[] { elementDA }); } else { Logger.Out("элемент уже на диаграмме", new EA.DiagramObject[] { elementDA }); } // Подгоняем ZOrder //SetElementZorder(elementDA); /* * // Проверяем наличие на диаграмме (непосредственных) элементов дочерней иерархии * // Еесли есть такие - вписываем их в текущий элемент * List<EA.DiagramObject> childDAList = EAHelper.GetNearestChildrenDA(element); * Logger.Out("получен список присутсвующих на диагр. дочерних ", childDAList.ToArray()); * foreach (var childDA in childDAList) * { * FitElementInElement(childDA, elementDA); * } * * * // Проверяем наличие на диаграмме элемента родительской иерархии * // При наличии вписываем элемент в него * List<EA.DiagramObject> parentDAList = EAHelper.GetDeployParentHierarchyDA(element); * Logger.Out("получен список родительской иерархии на диаграмме", parentDAList.ToArray()); * if (parentDAList.Count > 0) * { * var nearestParentDA = parentDAList[0]; * FitElementInElement(elementDA, nearestParentDA); * } */ } finally { ElementDesignerHelper.CallLevel--; } return(elementDA); }