private EA.DiagramObject copyDiagramObject(int leftMax, int topMax, EA.Diagram newDiagram, EA.DiagramObject oldDiagramObject, EA.Element element, int sequence) { EA.DiagramObject newDiaObj2 = (EA.DiagramObject)newDiagram.DiagramObjects.AddNew( "l=" + (oldDiagramObject.left - leftMax) + ";r=" + (oldDiagramObject.right - leftMax) + ";t=" + (oldDiagramObject.top - topMax) + ";b=" + (oldDiagramObject.bottom - topMax), element.Type); newDiaObj2.Sequence = sequence; newDiaObj2.ElementID = element.ElementID; newDiaObj2.Update(); return(newDiaObj2); }
/// <summary> /// Функция ищет оптимальное место для размещения внутри родительского контейнера /// </summary> /// <param name="parentDA"></param> /// <param name="childDA"></param> /// <param name="childDAList">список других элементов внутри родительского, чтобы не наступить на один из них</param> /// <returns></returns> public static ExecResult <Point> GetPointForChild(EA.DiagramObject parentDA, EA.DiagramObject childDA, List <EA.DiagramObject> childDAList) { ExecResult <Point> result = new ExecResult <Point>() { code = -1 }; // Сначала просто пытаемся поместить childDA возле левого верхнего угла Rectangle requiredRectangle = new Rectangle(parentDA.left + DAConst.border, parentDA.top - 2 * DAConst.border, childDA.right - childDA.left, childDA.top - childDA.bottom); bool intersectsWithOther = false; if (Contain(parentDA, requiredRectangle)) { foreach (var otherChildDA in childDAList) { if (otherChildDA.ElementID == childDA.ElementID) { continue; } if (Intersects(otherChildDA, requiredRectangle)) { intersectsWithOther = true; break; } } if (!intersectsWithOther) { result.value = new Point(requiredRectangle.X, requiredRectangle.Y); result.code = 0; return(result); } } // если мы здесь, значит тупо вписаться не удалось, начинаем шарить вокруг вписанных в родительский элементов, пытаясь найти место foreach (var otherChildDA in childDAList) { if (otherChildDA.ElementID == childDA.ElementID) { continue; } Point point = FindSpaceAround(childDA, otherChildDA, parentDA, childDAList); if (!point.IsEmpty) { result.value = point; result.code = 0; break; } } return(result); }
public static void VisualizePortForDiagramobject(int pos, EA.Diagram dia, EA.DiagramObject diaObjSource, EA.Element port, EA.Element interf) { // check if port already exists foreach (EA.DiagramObject diaObj in dia.DiagramObjects) { if (diaObj.ElementID == port.ElementID) { return; } } // visualize ports int length = 6; // calculate target position int left = diaObjSource.right - length / 2; int right = left + length; int top = diaObjSource.top; top = top - 10 - pos * 10; int bottom = top - length; string position = "l=" + left + ";r=" + right + ";t=" + top + ";b=" + bottom + ";"; var diaObject = (EA.DiagramObject)dia.DiagramObjects.AddNew(position, ""); dia.Update(); if (port.Type.Equals("Port")) { // not showing label diaObject.Style = "LBL=CX=97:CY=13:OX=0:OY=0:HDN=1:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:ALT=0:ROT=0;"; } else { // not showing label diaObject.Style = "LBL=CX=97:CY=13:OX=39:OY=3:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:ALT=0:ROT=0;"; } diaObject.ElementID = port.ElementID; diaObject.Update(); if (interf == null) { return; } // visualize interface var diaObject2 = (EA.DiagramObject)dia.DiagramObjects.AddNew(position, ""); dia.Update(); diaObject.Style = "LBL=CX=69:CY=13:OX=-69:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:ALT=0:ROT=0;"; diaObject2.ElementID = interf.ElementID; diaObject2.Update(); }
public static EA.Element createAnchorElementIfNecessary(EA.Repository repository, EA.Diagram openedDiagram, Boolean reloadDiagramAfter) { //checks if the current SDM Diagram already contains an Anchor element. //String sqlResult = repository.SQLQuery(@"SELECT Count(*) as Count FROM t_object WHERE ParentID = " + openedDiagram.ParentID + // " AND Stereotype = '" + SDMModelingMain.SDMAnchorStereotype + "'"); String sqlResult = repository.SQLQuery(@"select Count(*) as Count from t_diagramobjects d, t_object o where d.Object_ID = o.Object_ID and o.Stereotype = '" + SDMModelingMain.SDMAnchorStereotype + "' and d.Diagram_ID = " + openedDiagram.DiagramID); String count = EAUtil.getXMLNodeContentFromSQLQueryString(sqlResult, "Count")[0]; if (count == "0") { Boolean locked = false; EA.Element newAnchorElement = null; if (openedDiagram.ParentID != 0) { EA.Element parentElement = repository.GetElementByID(openedDiagram.ParentID); locked = parentElement.Locked; newAnchorElement = parentElement.Elements.AddNew("", Main.EAClassType) as EA.Element; } else { EA.Package parentPackage = repository.GetPackageByID(openedDiagram.PackageID); locked = parentPackage.Element.Locked; newAnchorElement = parentPackage.Elements.AddNew("", Main.EAClassType) as EA.Element; } if (!locked) { newAnchorElement.Stereotype = SDMModelingMain.SDMAnchorStereotype; newAnchorElement.Update(); EA.DiagramObject newAnchorDiagramObject = openedDiagram.DiagramObjects.AddNew("", newAnchorElement.Type) as EA.DiagramObject; newAnchorDiagramObject.left = 5; newAnchorDiagramObject.top = -5; newAnchorDiagramObject.right = 25; newAnchorDiagramObject.bottom = -25; newAnchorDiagramObject.ElementID = newAnchorElement.ElementID; newAnchorDiagramObject.Update(); if (reloadDiagramAfter) { repository.ReloadDiagram(openedDiagram.DiagramID); } return(newAnchorElement); } } return(null); }
/// <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 и вписанные в него DA на указанный вектор /// </summary> /// <param name="diagramObject"></param> /// <param name="vector"></param> public static void MoveContainedHierarchy(EA.DiagramObject diagramObject, Point vector) { // Сначала получаем и подывигаем детей List <EA.DiagramObject> containedDAList = EADOHelper.GetContainedForDA(diagramObject); foreach (var curContainedDA in containedDAList) { MoveContainedHierarchy(curContainedDA, vector); } // потом сам объект EADOHelper.ApplyVectorToDA(diagramObject, vector); }
private void copyDiagramObjects(int leftMax, int topMax, EA.Diagram newSdmDiagram, EA.Element selectedElement) { //copy storypattern diagramObjects foreach (EA.Element ov in selectedElement.Elements) { EA.DiagramObject oldOVDiagramObject = getDiagramObject(ov.ElementID); if (oldOVDiagramObject != null) { copyDiagramObject(leftMax, topMax, newSdmDiagram, oldOVDiagramObject, ov, 1); EAUtil.deleteDiagramObject(repository, oldSDMDiagram, ov); } } }
/// <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(); } }
public override void doRuleQuickFix(SQLElement eaElement, SQLRepository repository, int i, String errorMessage) { if (i == 0) { EAUtil.deleteElement(eaElement.getRealElement(), repository); } else if (i == 1) { EA.Diagram possibleDiagram = null; SQLElement parent = eaElement; SQLPackage parentPackage = null; while (possibleDiagram == null) { if (parent.ParentID != 0) { parent = repository.GetElementByID(parent.ParentID); if (parent.Diagrams.Count > 0) { possibleDiagram = parent.Diagrams.GetAt(0) as EA.Diagram; } } else { if (parentPackage == null) { parentPackage = repository.GetPackageByID(parent.PackageID); } else { parentPackage = repository.GetPackageByID(parentPackage.ParentID); } if (parentPackage.Diagrams.Count > 0) { possibleDiagram = parentPackage.Diagrams.GetAt(0) as EA.Diagram; } } } possibleDiagram = EAUtil.sqlEAObjectToOriginalObject(repository, possibleDiagram) as EA.Diagram; EA.DiagramObject diagObject = possibleDiagram.DiagramObjects.AddNew("", eaElement.Type) as EA.DiagramObject; diagObject.left = 20; diagObject.right = 120; diagObject.top = -20; diagObject.bottom = -70; diagObject.ElementID = eaElement.ElementID; diagObject.Update(); repository.OpenDiagram(possibleDiagram.DiagramID); EAUtil.clearSelectedDiagramObjects(repository); possibleDiagram.SelectedObjects.AddNew(diagObject.ElementID.ToString(), ""); repository.ReloadDiagram(possibleDiagram.DiagramID); } }
/// <summary> /// creates an empty story diagram related to the given Method /// </summary> /// <param name="method"></param> /// <param name="repository"></param> /// <param name="currentDiagram"></param> The currently open diagram. An anchor will be added to this diagram. public static void createStoryDiagram(SQLMethod method, EA.Repository repository, EA.Diagram currentDiagram) { EA.Element containingEClass = repository.GetElementByID(method.ParentID); SQLRepository sqlRepository = new SQLRepository(repository, false); EA.Element sdmContainer = (EA.Element)(containingEClass.Elements.AddNew(method.Name, Main.EAClassType)); sdmContainer.ParentID = containingEClass.ElementID; EA.Diagram sdmDiagram = (EA.Diagram)(sdmContainer.Diagrams.AddNew(method.Name + " Story Diagram", SdmDiagramMetatype[0])); sdmDiagram.ParentID = sdmContainer.ElementID; sdmDiagram.ExtendedStyle = "HideRel=0;ShowTags=0;ShowReqs=0;ShowCons=0;OpParams=1;ShowSN=0;ScalePI=0;PPgs.cx=1;PPgs.cy=1;PSize=9;ShowIcons=1;SuppCN=0;HideProps=0;HideParents=0;UseAlias=0;HideAtts=0;HideOps=0;HideStereo=0;HideEStereo=1;FormName=;"; sdmDiagram.StyleEx = sdmDiagram.StyleEx + "HideConnStereotype=0;"; repository.SaveDiagram(sdmDiagram.DiagramID); sdmDiagram.Update(); EA.Element startNode = (EA.Element)sdmContainer.Elements.AddNew(" Start", Main.EAStateNodeType); startNode.Subtype = Main.EAStartNodeSubtype; startNode.ParentID = sdmContainer.ElementID; startNode.Name = SDMUtil.computeStartNodeName(sqlRepository.GetMethodByID(method.MethodID), sqlRepository.GetElementByID(containingEClass.ElementID)); startNode.Update(); EA.DiagramObject startNodeDiagramObject = (EA.DiagramObject)sdmDiagram.DiagramObjects.AddNew("l=50;r=70;t=50;b=70;", Main.EAStateNodeType); startNodeDiagramObject.ElementID = startNode.ElementID; startNodeDiagramObject.Update(); method.getRealMethod().Update(); sdmContainer.Update(); Navigator.addAnchorEntry(sdmDiagram.DiagramID, currentDiagram.DiagramID); String objectStyleString = "StateNodeLBL=CX=437:CY=13:OX=-9:OY=-18:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:ALT=0:ROT=0;DUID=2B547EF9;LBL=CX=437:CY=13:OX=-6:OY=-17:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:ALT=0:ROT=0;"; repository.Execute("UPDATE t_diagramobjects SET ObjectStyle = '" + objectStyleString + "' WHERE Object_ID = " + startNodeDiagramObject.ElementID); repository.OpenDiagram(sdmDiagram.DiagramID); sdmContainer.Elements.Refresh(); setAnchorElementTags(sqlRepository, currentDiagram, sqlRepository.GetElementByID(sdmContainer.ElementID)); Activity activity = new Activity(sqlRepository.GetElementByID(sdmContainer.ElementID), sqlRepository); activity.OwningOperation = new ECOREModeling.ECOREExportWrapper.EOperation(sqlRepository.GetMethodByID(method.MethodID), sqlRepository); activity.saveTreeToEATaggedValue(true); StartNode startNodeObject = new StartNode(sqlRepository, sqlRepository.GetElementByID(startNode.ElementID)); startNodeObject.saveTreeToEATaggedValue(true); }
/// <summary> /// Устанавливает Zorder для нового элемента /// </summary> private void SetElementZorder(EA.DiagramObject diagramObject) { /* * План такой: * - на входе считаем, что ZOrder у всех нормальный кроме устанавливаемого * * - есть дерево дочерних (deploy) - обрабатываемый элемент надо положить "под них" * - есть прочие элементы, ZOrder которых был больше (ниже) дочерних выше - их всех надо "притопить" на единичку, т.к. под дочерними вставлен обрабатываемый * - все остальные не трогаем * */ EA.Element element = EARepository.GetElementByID(diagramObject.ElementID); // Получаем список родителей на диаграммме //List<EA.DiagramObject> parentDAList = EAHelper.GetDeployParentHierarchyDA(element); // Получаем список детей на диаграмме List <EA.DiagramObject> childrenDAList = LibraryHelper.GetDeployChildrenHierarchyDA(element); // наличие на диаграмме элементов дочерней иерархии, если есть такие - подкладываем элемент под них int elementZOrder = 0; foreach (var childDA in childrenDAList) { if (childDA.Sequence >= elementZOrder) { elementZOrder = childDA.Sequence + 1; } } foreach (EA.DiagramObject curDA in CurrentDiagram.DiagramObjects) { if (curDA.ElementID == diagramObject.ElementID) { diagramObject.Sequence = elementZOrder; diagramObject.Update(); } else if (curDA.Sequence >= elementZOrder) { curDA.Sequence = curDA.Sequence + 1; curDA.Update(); } } foreach (EA.DiagramObject curDA in CurrentDiagram.DiagramObjects) { Logger.Out("Zorder=" + curDA.Sequence, new EA.DiagramObject[] { curDA }); } }
private static bool CreateDefaultElementsForActivity(EA.Repository rep, EA.Diagram dia, EA.Element act) { // check if init and final node are available bool init = false; bool final = false; foreach (EA.Element node in act.Elements) { if (node.Type == "StateNode" & node.Subtype == 100) { init = true; } if (node.Type == "StateNode" & node.Subtype == 101) { final = true; } } if (!init) { EA.Element initNode = (EA.Element)act.Elements.AddNew("", "StateNode"); initNode.Subtype = 100; initNode.Update(); if (dia != null) { EA.DiagramObject initDiaNode = (EA.DiagramObject)dia.DiagramObjects.AddNew("l=295;r=315;t=125;b=135;", ""); initDiaNode.ElementID = initNode.ElementID; initDiaNode.Update(); } } if (!final) { EA.Element finalNode = (EA.Element)act.Elements.AddNew("", "StateNode"); finalNode.Subtype = 101; finalNode.Update(); if (dia != null) { EA.DiagramObject finalDiaNode = (EA.DiagramObject)dia.DiagramObjects.AddNew("l=285;r=305;t=745;b=765;", ""); finalDiaNode.ElementID = finalNode.ElementID; finalDiaNode.Update(); } } act.Elements.Refresh(); dia.DiagramObjects.Refresh(); dia.Update(); rep.ReloadDiagram(dia.DiagramID); return(true); }
private void addConstraintCopyToRule(EA.Element elementToBeCopied, EA.DiagramObject diagramObjectToBeCopied) { EA.Element newConstraint = newRuleElement.EmbeddedElements.AddNew(elementToBeCopied.Name, "Note") as EA.Element; newConstraint.Type = "Constraint"; newConstraint.Notes = elementToBeCopied.Notes; newConstraint.Update(); EA.DiagramObject newDiagramObject = newRuleDiagram.DiagramObjects.AddNew("", newConstraint.Type) as EA.DiagramObject; newDiagramObject.ElementID = newConstraint.ElementID; newDiagramObject.left = diagramObjectToBeCopied.left; newDiagramObject.right = diagramObjectToBeCopied.right; newDiagramObject.top = diagramObjectToBeCopied.top; newDiagramObject.bottom = diagramObjectToBeCopied.bottom; newDiagramObject.Update(); }
private int AddUCToUCDiagram(EA.Package eaPackage, EA.Diagram diagram, int iUCElementID, int iUCClassElementID, int iVertPos) { int iTopOffset = 10; int iHeightOneStep = 200; int iSpaceBetweenSteps = 20; int iL = 300; int iR = 400; int iT = iTopOffset + (iHeightOneStep * iVertPos) + iSpaceBetweenSteps; int iB = iTopOffset + (iHeightOneStep * (iVertPos + 1)); string strPos = "l=" + iL.ToString() + ";r=" + iR.ToString() + ";t=" + iT.ToString() + ";b=" + iB.ToString() + ";"; EA.DiagramObject diagramObj = diagram.DiagramObjects.AddNew(strPos, ""); if (diagramObj == null) { //EAImporter.LogError(EAImporter.LogErrorLevel.A, strLogInfo); return(1); } diagramObj.ElementID = iUCElementID; diagramObj.Update(); iL = 700; iR = 800; iT = iTopOffset + (iHeightOneStep * iVertPos) + iSpaceBetweenSteps; iB = iTopOffset + (iHeightOneStep * (iVertPos + 1)); strPos = "l=" + iL.ToString() + ";r=" + iR.ToString() + ";t=" + iT.ToString() + ";b=" + iB.ToString() + ";"; EA.DiagramObject diagramObj2 = diagram.DiagramObjects.AddNew(strPos, ""); if (diagramObj2 == null) { //EAImporter.LogError(EAImporter.LogErrorLevel.A, strLogInfo); return(1); } diagramObj2.ElementID = iUCClassElementID; diagramObj2.Update(); diagram.DiagramObjects.Refresh(); eaPackage.Diagrams.Refresh(); diagram.Update(); return(0); }
private static void createSDMActivityNodeDiagramObject(EA.Repository repository, EA.Diagram diagram, int i, int j, EA.Element node, List <Point> usedPoints, List <int> handledElementIds) { if (node.MetaType == SDMModelingMain.ActivityNodeMetatype) { Point currentPoint = new Point(i, j); int width = StoryNode.DefaultWidth; int height = StoryNode.DefaultHeight; if (node.Stereotype == SDMModelingMain.StopNodeStereotype || node.Stereotype == SDMModelingMain.StartNodeStereotype) { width = StopNode.DefaultWidth; height = StopNode.DefaultHeight; } while (usedPoints.Contains(currentPoint)) { currentPoint.Y = currentPoint.Y + 1; } EA.DiagramObject dObj = diagram.DiagramObjects.AddNew("", "") as EA.DiagramObject; dObj.ElementID = node.ElementID; dObj.left = currentPoint.X * 200 + (100 - width / 2); dObj.right = dObj.left + width; dObj.top = currentPoint.Y * -200 + (-100 + height / 2); dObj.bottom = dObj.top - height; dObj.Update(); String aa = " l = " + dObj.left + " r =" + dObj.right + " t = " + dObj.top + " b = " + dObj.bottom; handledElementIds.Add(node.ElementID); usedPoints.Add(currentPoint); foreach (EA.Connector con in node.Connectors) { if (con.SupplierID != node.ElementID && !handledElementIds.Contains(con.SupplierID)) { EA.Element target = repository.GetElementByID(con.SupplierID); createSDMActivityNodeDiagramObject(repository, diagram, currentPoint.X + 1, currentPoint.Y, target, usedPoints, handledElementIds); currentPoint.Y = currentPoint.Y + 1; currentPoint.X = currentPoint.X - 1; } } } }
private void appendNewMethodAndSdm() { repository.SaveDiagram(oldSDMDiagram.DiagramID); EA.Element eClass = getContainingClass(); this.newMethod = eClass.Methods.AddNew(textBoxNewSDM.Text, "void") as EA.Method; newMethod.Update(); SDMModelingMain.createStoryDiagram(sqlRepository.GetMethodByID(newMethod.MethodID), sqlRepository.GetOriginalRepository(), oldSDMDiagram); newSdmContainer = sqlRepository.GetOriginalRepository().GetElementByID(sqlRepository.GetCurrentDiagram().ParentID); EA.Diagram newSdmDiagram = newSdmContainer.Diagrams.GetAt(0) as EA.Diagram; EA.Element newStartNode = findNewStartNode(newSdmContainer); createExtractedSDMStatementNode(); int leftMax = 10000000; int topMax = -100000; computeLeftAndTopMin(ref leftMax, ref topMax); //copy elements foreach (EA.Element selectedElement in this.selectedActivityNodes) { selectedElement.ParentID = newSdmContainer.ElementID; EA.DiagramObject newPatternDiagramObject = null; copyDiagramObjects(leftMax - 100, topMax + 100, newSdmDiagram, selectedElement); EA.DiagramObject selectedDiagramObject = getDiagramObject(selectedElement.ElementID); if (selectedDiagramObject != null) { newPatternDiagramObject = copyDiagramObject(leftMax - 100, topMax + 100, newSdmDiagram, selectedDiagramObject, selectedElement, 2); EAUtil.deleteDiagramObject(repository, oldSDMDiagram, selectedElement); } //deleteUnselectedConnectors(selectedElement); selectedElement.Update(); arrangeUnselectedConnectors(newSdmContainer, newSdmDiagram, newStartNode, selectedElement, newPatternDiagramObject.bottom, newPatternDiagramObject.left); } repository.ReloadDiagram(newSdmDiagram.DiagramID); repository.ReloadDiagram(oldSDMDiagram.DiagramID); repository.OpenDiagram(oldSDMDiagram.DiagramID); }
private void createCorrespondenceDiagramObject(EA.Diagram currentDiagram, EA.Repository Repository, EA.Element clientOv, EA.Element supplierOv, EA.Element tggCorrespondenceObject) { //create a new diagram object Repository.SaveDiagram(currentDiagram.DiagramID); EA.DiagramObject sourceDiagObj = null; EA.DiagramObject targetDiagObj = null; currentDiagram.DiagramObjects.Refresh(); foreach (EA.DiagramObject diagObj in currentDiagram.DiagramObjects) { if (diagObj.ElementID == clientOv.ElementID) { sourceDiagObj = diagObj; } else if (diagObj.ElementID == supplierOv.ElementID) { targetDiagObj = diagObj; } if (sourceDiagObj != null && targetDiagObj != null) { continue; } } int sourceLeft = (sourceDiagObj == null) ? 0 : sourceDiagObj.left; int sourceRight = (sourceDiagObj == null) ? 0 : sourceDiagObj.right; int sourceBottom = (sourceDiagObj == null) ? 0 : sourceDiagObj.bottom; int sourceTop = (sourceDiagObj == null) ? 0 : sourceDiagObj.top; int targetLeft = (targetDiagObj == null) ? 0 : targetDiagObj.left; int targetRight = (targetDiagObj == null) ? 0 : targetDiagObj.right; int targetBottom = (targetDiagObj == null) ? 0 : targetDiagObj.bottom; int targetTop = (targetDiagObj == null) ? 0 : targetDiagObj.top; EA.DiagramObject tggLinkDiagObj = currentDiagram.DiagramObjects.AddNew("", "") as EA.DiagramObject; tggLinkDiagObj.ElementID = tggCorrespondenceObject.ElementID; tggLinkDiagObj.Update(); tggLinkDiagObj.left = (sourceLeft + targetLeft) / 2; tggLinkDiagObj.right = (sourceRight + targetRight) / 2; tggLinkDiagObj.bottom = (sourceBottom + targetBottom) / 2; tggLinkDiagObj.top = (sourceTop + targetTop) / 2; tggLinkDiagObj.Update(); currentDiagram.DiagramObjects.Refresh(); }
/// <summary> /// Размещает на диаграмме укзаанный элемент и иерархию его контейнеров /// </summary> /// <param name="onlyParent"></param> /// <returns></returns> public ExecResult <Boolean> PutChildrenDHierarchyOnElement() { ExecResult <Boolean> result = new ExecResult <bool>(); ElementDesignerHelper.CallLevel = 0; try { ExecResult <List <ComponentLevel> > displayLevelsResult = FSelectComponentLevels.Execute(); if (displayLevelsResult.code != 0) { return(result); } // Получаем текущий (библиотечный) элемент дерева if (Context.CurrentDiagram.SelectedObjects.Count == 0 || !LibraryHelper.IsLibrary(Context.EARepository.GetElementByID(((EA.DiagramObject)Context.CurrentDiagram.SelectedObjects.GetAt(0)).ElementID))) { throw new Exception("Не выделен библиотечный элемент на диаграмме"); } EA.Element curElement = Context.EARepository.GetElementByID(((EA.DiagramObject)Context.CurrentDiagram.SelectedObjects.GetAt(0)).ElementID); // Получаем список дочерних элементов контейнеров List <EA.Element> сhildrenDHierarchy = LibraryHelper.GetChildHierarchy(curElement); // Проходимся по иерархии и размещаем элементы на диаграмме for (int i = 0; i < сhildrenDHierarchy.Count; i++) { // Размещаем элемент EA.DiagramObject diagramObject = Context.Designer.PutElementOnDiagram(сhildrenDHierarchy[i]); diagramObject.Update(); } Context.CurrentDiagram.DiagramLinks.Refresh(); Context.LinkDesigner.SetLinkTypeVisibility(LinkType.Deploy, false); Context.EARepository.ReloadDiagram(Context.CurrentDiagram.DiagramID); } catch (Exception ex) { result.setException(ex); } return(result); }
/// <summary> /// Возвращает Список элементов диаграммы, являющихся для него родительскими /// </summary> /// <param name="element"></param> /// <returns>Отсортированный в сооответствии с род. иерархией список DiagramObjects</returns> public static List <EA.DiagramObject> GetDeployParentHierarchyDA(EA.Element element) { List <EA.DiagramObject> result = new List <EA.DiagramObject>(); // Получаем список родительской иерархии List <EA.Element> parentHierarchy = GetParentHierarchy(element); foreach (EA.Element curParent in parentHierarchy) { EA.DiagramObject curParentDA = Context.Designer.CurrentDiagram.GetDiagramObjectByID(curParent.ElementID, ""); if (curParentDA != null) { result.Add(curParentDA); } } return(result); }
/// <summary> /// Searches for a DiagramObject with the same ID as the element on the given diagram /// </summary> /// <param name="element"></param> /// <param name="diagram"></param> /// <returns>The found DiagramObject or null if there exists none</returns> public static EA.DiagramObject findDiagramObject(SQLRepository repository, EA.Element element, EA.Diagram diagram) { EA.Diagram currentDiagram = diagram; if (currentDiagram is SQLDiagram) { currentDiagram = sqlEAObjectToOriginalObject(repository, currentDiagram) as EA.Diagram; } EA.DiagramObject val = null; foreach (EA.DiagramObject diagObj in currentDiagram.DiagramObjects) { if (diagObj.ElementID == element.ElementID) { val = diagObj; break; } } return(val); }
/// <summary> /// Функция вычисляет требуемое расширение родительского элемента для вписывания в него childDA /// </summary> /// <param name="parentDA"></param> /// <param name="childDA"></param> /// <returns>Новый размер parentDA, позиция для child-а внутри parentDA</returns> public static Tuple <Size, Point> GetExpandedDASizeForChild(EA.DiagramObject parentDA, EA.DiagramObject childDA, List <EA.DiagramObject> childDAList) { Point resultPoint = new Point(); Size parentSize = GetSize(parentDA); Size childSize = GetSize(childDA); // получаем точку, от которой в элементе начинается свободное место var childDAList1 = childDAList.Where(da => da.ElementID != childDA.ElementID); // убираем из списка "внтури родительского" дочерний Point parentDAFreeBorders = GetDAFreeBorders(parentDA, childDAList); // получаем точку начала свободного места // далее упрощённо - если ширина больше высоты - увеличиваем высоту // иначе - увеличиваем ширину if (parentSize.Width > parentSize.Height) { // Увеличиваем parentDA вниз parentSize.Height = parentSize.Height + childSize.Height + 3 * DAConst.border - (parentSize.Height - Math.Abs(parentDAFreeBorders.Y)); if (parentSize.Width < (childSize.Width + 2 * DAConst.border)) { parentSize.Width = childSize.Width + 2 * DAConst.border; } // размещение childDA = у левой и нижней границы resultPoint.X = DAConst.border; resultPoint.Y = -parentSize.Height + DAConst.border + childSize.Height; } else { // Увеличиваем parentDA вправо parentSize.Width = parentSize.Width + childSize.Width + 2 * DAConst.border - (parentSize.Width - parentDAFreeBorders.X); if (parentSize.Height < (childSize.Height + 3 * DAConst.border)) { parentSize.Height = childSize.Height + 3 * DAConst.border; } // размещение childDA = у правой верхней границы resultPoint.X = parentSize.Width - DAConst.border - childSize.Width; resultPoint.Y = -2 * DAConst.border; } return(new Tuple <Size, Point>(parentSize, resultPoint)); }
/// <summary> /// Проверяет, что элементы-концы (линка) помещены на текущую диаграмму /// </summary> /// <param name="connector"></param> public static bool IsConnectorEndsOnCurrentDiagram(int sourceElementID, int targetElementID) { bool result = false; if (Context.CurrentDiagram == null) { return(false); // Диаграмма не открыта } EA.DiagramObject sourceDA = Context.CurrentDiagram.GetDiagramObjectByID(sourceElementID, ""); EA.DiagramObject targetDA = Context.CurrentDiagram.GetDiagramObjectByID(targetElementID, ""); if (sourceDA != null && targetDA != null) { result = true; } return(result); }
/// <summary> /// Возвращает Список всех дочерних (deploy, всё дерево) элементов диаграммы, присутствующих на диаграмме /// </summary> /// <param name="eaElement"></param> /// <returns></returns> public static List <EA.DiagramObject> GetDeployChildrenHierarchyDA(EA.Element eaElement) { List <EA.DiagramObject> result = new List <EA.DiagramObject>(); // Получаем собственно дочерних List <EA.Element> childrenElements = GetChildHierarchy(eaElement); // для каждого проверяем, нет ли его на диаграмме foreach (EA.Element childElement in childrenElements) { EA.DiagramObject childElementDA = Context.CurrentDiagram.GetDiagramObjectByID(childElement.ElementID, ""); if (childElementDA != null) // если есть на диаграмме - добавляем его в результат { result.Add(childElementDA); } } return(result); }
/// <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); }
private static void printTggCorrespondenceObjectTree(EA.Element child, EA.Diagram diagram, EA.Repository repository, List <int> usedY, List <Point> usedPoints, List <int> usedElementIds) { int x = 2; int y = 1; while (usedY.Contains(y)) { y++; } EA.DiagramObject diagObject = diagram.DiagramObjects.AddNew("", "") as EA.DiagramObject; diagObject.ElementID = child.ElementID; diagObject.left = x * 200; diagObject.right = diagObject.left + 125; diagObject.top = y * -100; diagObject.bottom = diagObject.top - 50; diagObject.Update(); usedY.Add(y); usedPoints.Add(new Point(x, y)); }
public static void fillDiagramFromCollections(EA.Diagram diagram, EA.Collection elementCollection, EA.Collection packageCollection) { if (elementCollection != null) { foreach (EA.Element element in elementCollection) { EA.DiagramObject diagramObject = diagram.DiagramObjects.AddNew(element.Name, element.Type) as EA.DiagramObject; diagramObject.ElementID = element.ElementID; diagramObject.Update(); } } if (packageCollection != null) { foreach (EA.Package pkg in packageCollection) { EA.DiagramObject diagramObject = diagram.DiagramObjects.AddNew(pkg.Name, "") as EA.DiagramObject; diagramObject.ElementID = pkg.Element.ElementID; diagramObject.Update(); } } }
private EA.DiagramObject AddDiagramObject(EA.Diagram diagram, int iLinkedElementID, string strPos) { string strLogInfo = "diagram object for link ID: " + iLinkedElementID.ToString(); EAImporter.LogMsg(EAImporter.LogMsgType.Adding, strLogInfo); EA.DiagramObject diagramObj = diagram.DiagramObjects.AddNew(strPos, ""); if (diagramObj == null) { EAImporter.LogError(EAImporter.LogErrorLevel.A, strLogInfo); return(null); } diagramObj.ElementID = iLinkedElementID; diagramObj.Update(); diagram.DiagramObjects.Refresh(); EAImporter.LogMsg(EAImporter.LogMsgType.Added, strLogInfo); return(diagramObj); }
/// <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> /// Функция возвращает свободное место на диаграмме для размещения DA /// Точку в левом / правом верхнем углу /// </summary> /// <returns></returns> public static Point GetFirstFreePoinForDA(EA.DiagramObject diagramObject) { Size daSize = GetSize(diagramObject); Point result = new Point(DAConst.border, -DAConst.border); // начальная точка - возле левого верхнего угла Point result1 = new Point(DAConst.border, -DAConst.border); // Проходимся по элементам, одновременно решая, пересекается ли элемент с другими // и вычисляя минимальную правую незанятую точку на тот случай если пересекается bool intersects = false; foreach (EA.DiagramObject curDA in Context.CurrentDiagram.DiagramObjects) { if (curDA.ElementID == diagramObject.ElementID) { continue; // вообще то он ещё не проапдейчен и его нет, но на всякий случай.... } if (!intersects && Intersects(diagramObject, curDA)) { intersects = true; } if ((curDA.right + DAConst.border) >= result1.X) { result1.X = curDA.right + DAConst.border; } } if (!intersects) { return(result); } else { return(result1); } }
/// <summary> /// Функция возвращает точку внутри DA (координаты отсчитываются от DA), правее и ниже которой нет дочерних элементов /// </summary> /// <param name="DA">объект, куда вписываем</param> /// <param name="childDAList">прочие объекты внутри DA</param> /// <returns></returns> private static Point GetDAFreeBorders(EA.DiagramObject diagramObject, List <EA.DiagramObject> childDAList) { Point result = new Point(diagramObject.left, diagramObject.top); foreach (var childDA in childDAList) { if (result.X < childDA.right) { result.X = childDA.right; } if (result.Y > childDA.bottom) { result.Y = childDA.bottom; } } // Делаем координаты относительно diagramObject result.X = result.X - diagramObject.left; result.Y = result.Y - diagramObject.top; return(result); }