/// <summary>
        /// Returns the edge an embedded element is bound to (left, right, top, bottom)
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="rep"></param>
        /// <returns></returns>
        public static EmbeddedPosition Edge(this EA.DiagramObject obj, EA.Repository rep)
        {
            EA.Element el = rep.GetElementByID(obj.ElementID);


            EA.Element elParent = el.GetParentOfEmbedded(rep);
            if (elParent == null)
            {
                return(EmbeddedPosition.Undefined);
            }
            // for Required/Required Interface use the owning Port for the position
            if (el.Type == "ProvidedInterface" ||
                el.Type == "RequiredInterface")
            {
                if (el.ParentID == 0)
                {
                    return(EmbeddedPosition.Undefined);
                }
                el = rep.GetElementByID(el.ParentID);
            }


            EA.Diagram       dia              = rep.GetDiagramByID(obj.DiagramID);
            EA.DiagramObject objParent        = dia.GetDiagramObjectByID(elParent.ElementID, "");
            EA.DiagramObject objFirstEmbedded = dia.GetDiagramObjectByID(el.ElementID, "");
            if (objParent == null)
            {
                return(EmbeddedPosition.Undefined);
            }

            int horicontalCenter = objFirstEmbedded.left + (objFirstEmbedded.right - objFirstEmbedded.left) / 2;
            int verticalCenter   = objFirstEmbedded.top - (objFirstEmbedded.top - objFirstEmbedded.bottom) / 2;

            if (horicontalCenter < objParent.left + 10 && horicontalCenter > objParent.left - 10)
            {
                return(EmbeddedPosition.Left);
            }
            if (horicontalCenter < objParent.right + 10 && horicontalCenter > objParent.right - 10)
            {
                return(EmbeddedPosition.Right);
            }


            if (verticalCenter < objParent.top + 10 && verticalCenter > objParent.top - 10)
            {
                return(EmbeddedPosition.Top);
            }
            if (verticalCenter < objParent.bottom + 10 && verticalCenter > objParent.bottom - 10)
            {
                return(EmbeddedPosition.Bottom);
            }
            return(EmbeddedPosition.Undefined);
        }
        /// <summary>
        /// Get parent Element of an Embedded Element which isn't an embedded element. Returns null if not found
        /// </summary>
        /// <param name="el"></param>
        /// <param name="rep"></param>
        /// <returns></returns>

        public static EA.Element GetParentOfEmbedded(this EA.Element el, EA.Repository rep)
        {
            if (!el.IsEmbeddedElement(rep, true))
            {
                return(el);
            }
            if (el.ParentID == 0)
            {
                return(null);
            }
            EA.Element elParent = rep.GetElementByID(el.ParentID);
            if (elParent.IsEmbeddedElement(rep, true))
            {
                return(elParent.GetParentOfEmbedded(rep));
            }
            return(elParent);
        }