通过c#外接程序限制Enterprise Architect中的子元素
本文关键字:Architect 元素 Enterprise 程序 通过 | 更新日期: 2023-09-27 18:04:24
我正在开发Enterprise Architect中的c#插件,为用户提供一个限制,以便只有特定的子元素可以添加到特定的父元素中。
例如子元素 A必须放到父元素 B上,如果子元素A被拖放到父元素 C上,则子元素A被删除。我正在使用EA_OnPostNewElement方法和相同的删除方法,它工作良好。
我的疑问是,在用户将子元素放在特定的父元素上之后,一段时间后,他可以将子元素拖到父元素之外,并将其作为子元素添加到图中的任何其他元素中。
是否有一种方法可以通过观察用户在企业架构师GUI上所做的更改来在这里添加限制,并将子元素带回到原始的父位置。请帮助。
您需要同时使用EA_OnContextItemChanged和EA_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
是否被触发,当你改变一个元素的所有者。但即使不是这种情况,您也可以在选择新元素后验证它是否仍然具有相同的所有者。