通过 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_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();
}
}
}
希望对您有所帮助..!
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();
这两个代码都可以用于重新加载图表。
我正在 Enterprise Architect 中使用 C# 加载项对用户进行限制,以便只能将特定的子元素添加到特定的父元素。
例如,如果子 元素 A 必须放在父 元素 B 上,如果将子元素 A 拖放到父元素 元素 C。我正在使用 EA_OnPostNewElement 方法和相同的删除方法,它工作正常。
我的疑问是,在用户将子元素放到特定父元素上之后,一段时间后他可以将子元素拖到父元素之外,并将其作为子元素添加到图中的任何其他元素。
有没有办法通过观察用户在 Enterprise architect GUI 上所做的更改并将子元素带回原始父位置来在此处添加限制。请帮忙。
您可以使用 context events 来跟踪所选元素及其所有者。
我不确定当您更改元素的所有者时是否触发了事件 EA_OnNotifyContextItemModified
。
但即使不是这种情况,您也可以在选择新元素后验证它是否仍然具有相同的所有者。
你需要同时使用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();
}
}
}
希望对您有所帮助..!
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();
这两个代码都可以用于重新加载图表。