通过c#外接程序限制Enterprise Architect中的子元素

本文关键字:Architect 元素 Enterprise 程序 通过 | 更新日期: 2023-09-27 18:04:24

我正在开发Enterprise Architect中的c#插件,为用户提供一个限制,以便只有特定的子元素可以添加到特定的父元素中。

例如子元素 A必须放到父元素 B上,如果子元素A被拖放到父元素 C上,则子元素A被删除。我正在使用EA_OnPostNewElement方法和相同的删除方法,它工作良好。

我的疑问是,在用户将子元素放在特定的父元素上之后,一段时间后,他可以将子元素拖到父元素之外,并将其作为子元素添加到图中的任何其他元素中。

是否有一种方法可以通过观察用户在企业架构师GUI上所做的更改来在这里添加限制,并将子元素带回到原始的父位置。请帮助。

通过c#外接程序限制Enterprise Architect中的子元素

您需要同时使用EA_OnContextItemChangedEA_OnNotifyContextItemModified以便您可以实现它。

声明一个字典

 public Dictionary<int, int> lstChildElements = new Dictionary<int, int>();

这里是示例代码

public void EA_OnContextItemChanged(EA.Repository Repository, string GUID, EA.ObjectType ot)
    {
        EA.Element addedElement = Repository.GetElementByGuid(GUID);
        if (addedElement == null)
            return;
        int identifiedParentID = 0;
        bool isAvailable = lstChildElements.TryGetValue(addedElement.ElementID, out identifiedParentID);
        if (!isAvailable)
        {
            if (addedElement.Stereotype == "Child" && addedElement.ParentID != 0)
            {
                EA.Element parentElemnt = Session.Repository.GetElementByID(addedElement.ParentID);
                if (parentElemnt != null)
                    if (parentElemnt.Stereotype == "anyCustomDefined")
                        lstChildElements.Add(addedElement.ElementID, addedElement.ParentID);
            }
        }

    }
    public void EA_OnNotifyContextItemModified(EA.Repository Repository, string GUID, EA.ObjectType ot)
    {
        EA.Element addedElement = Repository.GetElementByGuid(GUID);
        if (addedElement == null)
            return;
        int identifiedParentID = 0;
        bool isAvailable = lstChildElements.TryGetValue(addedElement.ElementID, out identifiedParentID);
        if (isAvailable)
        {
            if (addedElement.Stereotype == "Child" && addedElement.ParentID != 0)
            {
                EA.Element parentElemnt = Repository.GetElementByID(addedElement.ParentID);
                if (parentElemnt != null)
                    if (parentElemnt.Stereotype != "anyCustomDefined")
                    {
                        addedElement.ParentID = identifiedParentID != 0 ? identifiedParentID : addedElement.ParentID;
                        addedElement.Update();
                        lstChildElements[addedElement.ElementID] = addedElement.ParentID;
                    }
            }
            else if (addedElement.Stereotype == "Child" && addedElement.ParentID == 0)
            {
                addedElement.ParentID = identifiedParentID;
                addedElement.Update();
            }
        }

    }

希望有帮助…

和更新图需要重新加载。

EA.Diagram activeDiagram = Session.Repository.GetCurrentDiagram();
        if (activeDiagram != null)
            Session.Repository.ReloadDiagram(activeDiagram.DiagramID);

Repository.RefreshOpenDiagrams();

这两个代码都可以用来重新加载图表。

您可以使用上下文事件来跟踪所选元素及其所有者。

我不确定事件EA_OnNotifyContextItemModified是否被触发,当你改变一个元素的所有者。但即使不是这种情况,您也可以在选择新元素后验证它是否仍然具有相同的所有者。