通过 C# 加载项限制 Enterprise Architect 中的子元素

Restricting child element in Enterprise Architect through C# add-in

我正在 Enterprise Architect 中使用 C# 加载项对用户进行限制,以便只能将特定的子元素添加到特定的父元素。

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

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

有没有办法通过观察用户在 Enterprise architect GUI 上所做的更改并将子元素带回原始父位置来在此处添加限制。请帮忙。

您可以使用 context events 来跟踪所选元素及其所有者。

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

你需要同时使用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();
            }
        }



    }

希望对您有所帮助..!

and for updating in diagram need to reload it.

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

Repository.RefreshOpenDiagrams();

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