我想从我的外部java程序生成一个活动图。我现在的问题是添加一个结构化的活动(带有子活动图)。
这是我的代码:
//Add the structured activity to the package
Element structActivityElement= elements.AddNew("My Structured Activity","Activity");
structActivityElement.SetSubtype(8);
//add activitydiagram to the structured activity
Diagram newDiagram = structActivityElement.GetDiagrams().AddNew("SubActivityDiagram", "Activity");
newDiagram.Update();
structActivityElement.Update();
elements.Refresh();
//Add the element to the root activity diagram
DiagramObject dob = dobs.AddNew("", "");
dobs.Refresh();
//reference the DiagramObject to the before created element
dob.SetElementID(element.GetElementID());
dob.Update();
dobs.Refresh();
运行后,我在Enterprise Architect中只看到一个正常的活动。通常当我双击结构化活动时,它会出现子活动图,但是当我双击这个生成的活动时,什么也不会发生。有人知道吗?
元素类的属性是"CompositeDiagram"。但是没有像
这样的方法setCompositeDiagram()
对
看起来您已经正确地创建了图表,因此您应该在项目浏览器中看到它(您可能需要调用strActionElement.GetDiagrams().Refresh()
)。但是一个元素可以包含一个图,而不是复合的。事实上,一个元素可以包含任意数量的图,但是只有一个图可以是复合图,当您双击另一个图中的元素时,它将被打开。
没有setCompositeDiagram()
方法,但Element.IsComposite
属性是读写。这就是你需要设置的:
element.IsComposite = 1;
element.Update();
我很确定,如果您设置了该属性,并且元素中没有图表,则会创建一个(如果有两个或更多图表,则选择第一个作为组合图)。这意味着您不必按照您所做的方式创建它,只要您想要默认的图类型(对于结构化活动来说是一个活动图)。
你应该像Uffe建议的那样使用isComposite属性,但如果由于某种原因无法使用,你可以使用这个(vbscript)代码作为解决方案:
'set the given diagram as composite diagram for this element
function setCompositeDiagram (element, diagram)
if not diagram is nothing then
'Tell EA this element is composite
dim objectQuery
objectQuery = "update t_object set NType = 8 where Object_ID = " & element.ElementID
Repository.Execute objectQuery
if element.Type = "Object" then
'Tell EA which diagram is the composite diagram
dim xrefQuery
xrefquery = "insert into t_xref (XrefID, Name, Type, Visibility, Partition, Client, Supplier) values ('"&CreateGuid&"', 'DefaultDiagram', 'element property', 'Public', '0', '"& element.ElementGUID & "', '"& diagram.DiagramGUID &"')"
Repository.Execute xrefquery
elseif element.Type = "Activity" then
'for activities we need to update PDATA1 with the diagramID
dim updatequery
updatequery = "update t_object set PDATA1 = "& diagram.DiagramID & " where Object_ID = " & element.ElementID
Repository.Execute updatequery
end if
end if
end function