Scripting 使用java编写企业架构师脚本-activitydiagram添加结构化活动

Scripting 使用java编写企业架构师脚本-activitydiagram添加结构化活动,scripting,uml,enterprise-architect,activity-diagram,Scripting,Uml,Enterprise Architect,Activity Diagram,我想从外部java程序生成一个活动图。 我现在的问题是添加一个结构化活动(带有一个子activitydiagram) 这是我的代码: //Add the structured activity to the package Element structActivityElement= elements.AddNew("My Structured Activity","Activity"); structActivityElement.SetSubtype(8); //add activityd

我想从外部java程序生成一个活动图。 我现在的问题是添加一个结构化活动(带有一个子activitydiagram)

这是我的代码:

//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();      
运行此命令后,我只看到EnterpriseArchitect中的一个正常活动。通常,当我双击一个结构化活动时,它会出现在子activitydiagram中,但当我双击这个生成的活动时,什么也不会发生。有人有主意吗

元素类具有属性“CompositeDiagram”。但是没有像这样的方法

setCompositeDiagram()

关于

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

没有
setCompositeDiagram()
方法,但是属性
元素.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

与问题无关,您的变量名意味着您正在使用一个Action元素,但实际上您正在创建一个活动。动作是活动的一个实例,所以这两个元素类型是相关的,但它们不是同一件事。哦,这是我的错误。复制并粘贴我的“AddActionToDiagram”-方法:)我将编辑我的问题你好,Uffe,谢谢你的回答:)是的,我在项目浏览器中看到了图表,但双击StructuredActivity时它不会出现。我在sparxsystems.com的参考中也看到了这个属性。但在我包含的库(eaapi.jar)中,没有类似element.setIsComposite()的方法。设置布尔属性的唯一可用方法是:SetIsActive()、SetIsLeaf()、SetIsNew()、SetIsSpec()。你还有其他想法吗?你使用的是最新版本的EA吗?如果是这样的话,那么您应该将其报告为bug,因为javaapi包装中缺少这个bug。作为一种解决方法,您可以使用“旧”方式进行合成。有关代码示例,请参见我的答案