0

我想从我的外部 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()

问候

4

2 回答 2

2

看起来您已正确创建图表,因此您应该在项目浏览器中看到它(您可能需要调用strActionElement.GetDiagrams().Refresh())。但是一个元素可以包含一个图表而不是复合的。事实上,一个元素可以包含任意数量的图,但只有一个图可以是组合图,这是在另一个图中双击元素时打开的组合图。

没有setCompositeDiagram()方法,但属性Element.IsComposite是读/写。这就是您需要设置的内容:

element.IsComposite = 1;
element.Update();

我很确定如果您设置了此属性并且元素中没有图表,则会创建一个(如果有两个或更多图表,则选择第一个作为复合图表)。这意味着您不必按照您的方式创建它,只要您想要默认的图表类型(对于结构化活动,它是活动图表)。

于 2014-05-22T08:36:04.060 回答
0

您应该按照 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
于 2016-03-09T12:52:06.733 回答