ログイン
検索
メインメニュー
フォーラム一覧   -   トピック一覧
   astah*の使い方
     astah* APIによる複合フラグメントの入れ子構造の取得
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
muryo13
投稿日時: 2021-4-12 23:41
新米
登録日: 2021-4-12
居住地:
投稿: 1
astah* APIによる複合フラグメントの入れ子構造の取得
シーケンス図上の複合フラグメントの入れ子構造をastah* APIで取得することはできるでしょうか。
たとえば、loopブロックの中にaltブロックがあるようなものを考えています。

XMLファイルで出力してみたところ、InteractionOperandの中に<UML:InteractionOperand.fragment>があって、このオブジェクトが相互作用オペランド内にいる複合フラグメントのオブジェクトを保持しているように見えました。
そこでAPIに、IInteractionOperand::getFragments()のようなものが用意されていることを期待したのですが見つかりませんでした

複合フラグメントの入れ子構造を取得する方法があれば教えてください。
モデルでなく、プレゼンテーション情報から取得する方法でも構いません。
よろしくお願いいたします。
tiwa___
投稿日時: 2021-4-13 14:51
開発者
登録日: 2019-7-29
居住地:
投稿: 8
Re: astah* APIによる複合フラグメントの入れ子構造の取得
申し訳ありませんが、入れ子構造を直接取得するような
APIはございません。

入れ子構造を取得するには
ModelFinderで同じ図上にある複合フラグメントを取得し
プレゼンテーションの矩形から親子関係を推測する必要があります。

下記は図上で選択した複合フラグメントの親を表示する
サンプルスクリプトです。



infNamespace = 'com.change_vision.jude.api.inf'
var ModelFinder = Java.type(infNamespace + '.project.ModelFinder');
var ICombinedFragment = Java.type(infNamespace + '.model.ICombinedFragment');
var Point2D = Java.type('java.awt.geom.Point2D')

run()

function run() {
    
    var selectedPresentations = getSelectedPresentations()
    if (selectedPresentations.length == 0) {
        print('Please select an element in a diagram')
        return
    }

    var selectedPresentation = selectedPresentations[0]
    var currentDiagram = selectedPresentation.getDiagram()
    var selectedModel = selectedPresentation.getModel()
    
    var combinedFragments = astah.findElements(new ModelFinder() {
	    isTarget : function (element) {
            if (element instanceof ICombinedFragment
                && element.getPresentations()[0].getDiagram() == currentDiagram
                && element != selectedModel) {
                return true;
            }
        }
    })

    var parents = new Array()
    var targetRect = selectedPresentation.getRectangle()
    for (var i in combinedFragments) {
        var parentRect = combinedFragments[i].getPresentations()[0].getRectangle()
        if (parentRect.contains(targetRect)) {
            parents.push(combinedFragments[i])
        }
    }

    parents.sort(function(a, b){
        var aH = a.getPresentations()[0].getRectangle().getHeight()
        var bH = b.getPresentations()[0].getRectangle().getHeight()
        return aH - bH
    })

    print(parents[0])
}


function getSelectedPresentations() {
    var viewManager = astah.getViewManager()
    var diagramViewManager = viewManager.getDiagramViewManager()
    var selectedPresentations = diagramViewManager.getSelectedPresentations()
    return Java.from(selectedPresentations)
}
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を