english japanese

はじめに

astah* SysML APIは、astah* SysMLのモデルデータを活用したアプリケーションソフトウェアを開発するためのJavaインターフェース群です。
これらを用いてastah* SysMLのモデルや図、図要素を取得、作成、編集できます。


使用許諾

  • astah* APIの.jar形式ファイルであるastah-api.jarの再配布を禁止します
  • その他のastah* API使用上の許諾事項は「astah*使用許諾契約書」に準じます。


利用要件

  • astah* を実行できるJava実行環境
  • astah* SysML本体をインストールしていること
  • アプリケーションのコンパイルには、astah-api.jarが必要です
  • アプリケーションの実行には、astah-api.jarと、astah-sys.jarが必要です

実行時に大きな.asmlファイルを扱う場合.
大きなファイルを扱う場合は、JavaVMのメモリ管理オプション設定が必要です。
初期ヒープサイズ16MB、最大ヒープサイズ256MBの指定:
-Xms16m -Xmx256m


サンプルアプリケーション

astah* SysML APIを使ったサンプルアプリケーションをgithubで公開しています。
ぜひご活用ください。


利用手順は下記の通りです。

  1. astah* Plug-in SDKをインストールします をのコンパイルと実行に使います)
  2. 使いたいサンプルをgithub上のリポジトリからクローンします
  3. cloneで出来たフォルダを、コンソール上で作業フォルダに指定します
  4. ビルドを実行します
    astah-build
  5. コマンドを実行します
    astah-mvn -q exec:exec [-DmodelPath=YOUR_MODEL_PATH]


モデルとプレゼンテーション

astah*のプロジェクト内には、モデルと、図要素の描画情報を持つプレゼンテーションがあります。
例えば、ブロックが持つ要素(制約や操作など)を参照、編集する場合は、モデルに対して操作します。図上に描画されたブロックの色を参照、編集する場合は、プレゼンテーションに対して操作します。 モデルとプレゼンテーションの対応は必ずしも1:1ではありません。ステートマシン図、アクティビティ図、シーケンス図のモデルとプレゼンテーションは1:1ですが、ノートアンカーやフレーム等モデルのないプレゼンテーションがあります。 共通のモデルを持つプレゼンテーションもあれば、モデルを持たないプレゼンテーションもあります。


プロジェクトを操作する

astah*モデルの参照、編集時は、まずプロジェクトにアクセスすることが必要です。 プロジェクトへアクセスには、ProjectAccessorを使用します。 astah* SysML APIでは、一度にひとつのプロジェクトのみ処理することが可能です。複数のプロジェクトを処理する場合は、元のプロジェクトを閉じてから、次のプロジェクトを開いてください。

プロジェクトを開く・閉じる

ProjectAccessor prjAccessor = AstahAPI.getAstahAPI().getProjectAccessor();
prjAccessor.open("C:\\test.asml");
prjAccessor.close();

プロジェクトを作成・保存する

ProjectAccessor prjAccessor = AstahAPI.getAstahAPI().getProjectAccessor();
prjAccessor.create("C:\\test.asml");
prjAccessor.save();
prjAccessor.close();

プロジェクトを別名保存する

ProjectAccessor prjAccessor = AstahAPI.getAstahAPI().getProjectAccessor();
prjAccessor.create("C:\\test.asml");
prjAccessor.saveAs("C:\\test2.asml");
prjAccessor.close();

モデルを参照する

プロジェクトの起点となるモデルを取得する

astahファイルの全モデル情報は、プロジェクトを表すモデル(以下、プロジェクトモデル)の下にツリー状に存在します。
まず、ProjectAccessorオブジェクトを取得して、astahファイルを開き、プロジェクトモデル(IModelクラスのオブジェクト)を取得します。

ProjectAccessor prjAccessor = AstahAPI.getAstahAPI().getProjectAccessor();
// Open project file
prjAccessor.open(inputFile);
// Get project model
IModel iModel = prjAccessor.getProject();

再帰的に全てのブロックを取得する

パッケージ(IPackage)を継承するサブシステムやモデルもパッケージに含めます。
パッケージ(IPackage)の直下にある全モデル要素を、メソッドgetOwnedElements()の利用し配列として取得し、その中からパッケージのみを抽出します。また、取得したパッケージも同様の処理することで、再帰的に全てのパッケージを取得できます。

/**
* Get blocks under packages recursively.
*
* @param iPackage
* Selected Package
* @param iBlocks
* The list of all stored blocks
* @return The list of all stored package
*/
	private List getBlocks(IPackage iPackage)  {
	    List iBlocks = new ArrayList();
	    INamedElement[] iNamedElements = iPackage.getOwnedElements();
	    for (int i = 0; i < iNamedElements.length; i++) {
	        INamedElement iNamedElement = iNamedElements[i];
	        if (iNamedElement instanceof IPackage) {
	            iBlocks.addAll(getBlocks((IPackage)iNamedElement));
	        }
	        if (iNamedElement instanceof IBlock) {
	            iBlocks.add(iNamedElement);
	        }
	    }
	    return iBlocks;
	}

プロジェクトからモデルを検索する

 

ProjectAccessorには3つの検索メソッドがあります。

findElements(Class elementKind, String name) - モデル名と種類で検索する

/** ProjectAccessor prjAccessor =
 AstahAPI.getAstahAPI().getProjectAccessor();
prjAccessor.open("C:\\test.asml");
//Search a Block Definition Diagram named dgm0
INamedElement[] iNamedElements = prjAccessor.findElements
(IBlockDefinitionDiagram.class, "dgm0");
//Search a Block named A
iNamedElements = prjAccessor.findElements(IBlock.class, "A");
//Search an attribute named B
iNamedElements = prjAccessor.findElements(IAttribute.class, "B");
//Search an operation named C
iNamedElements = prjAccessor.findElements(IOperation.class, "C");
//Search an association named D
iNamedElements = prjAccessor.findElements(IAssociation.class, "D");
//Search an UseCase named E
iNamedElements = prjAccessor.findElements(IUseCase.class, "E");
//Search an Include named F
iNamedElements = prjAccessor.findElements(IInclude.class, "F");
//Search a state named G
iNamedElements = prjAccessor.findElements(IState.class, "G");
//Search a pseudostate named H
iNamedElements = prjAccessor.findElements(IPseudostate.class, "H");
//Search a transition named I
iNamedElements = prjAccessor.findElements(ITransition.class, "I");
//Search a partition named J
iNamedElements = prjAccessor.findElements(IPartition.class, "J");
//Search an action named K
iNamedElements = prjAccessor.findElements(IAction.class, "K");
//Search an objectnode named L
iNamedElements = prjAccessor.findElements(IObjectNode.class, "L");
//Search a flow named M
iNamedElements = prjAccessor.findElements(IFlow.class, "M");
//Search a lifeline named N
iNamedElements = prjAccessor.findElements(ILifeline.class, "N");
//Search a message named O
iNamedElements = prjAccessor.findElements(IMessage.class, "O");
prjAccessor.close();

findElements(Class elementKind)実装例:
ブロック定義図を検索する

ProjectAccessor prjAccessor = AstahAPI.getAstahAPI()
.getProjectAccessor();
prjAccessor.open("C:\\test.asml");
//Search a block definition diagram
INamedElement[] iNamedElements = prjAccessor.
findElements(IBlockDefinitionDiagram.class);
prjAccessor.close();

findElements(ModelFinder picker)実装例:
dgm0という名前のブロック定義図を抽出する

//A class that implements ModelFinder interface.
//Search a Block Definition Diagram named dgm0
class BlockDefinitionDiagramPicker implements ModelFinder {
    public boolean isTarget(INamedElement namedElement) {
        if (namedElement instanceof IBlockDefinitionDiagram) {
            if ("dgm0".equals(namedElement.getName())) {
                return true;
            }
            return false;
        }
        return false;
    }
}

ProjectAccessor prjAccessor = AstahAPI.getAstahAPI().
getProjectAccessor(); prjAccessor.open("C:\\test.asml");
//Search a Block Definition Diagram named dgm0
INamedElement[] iNamedElements = prjAccessor.findElements
(new BlockDefinitionDiagramPicker());
prjAccessor.close();

プレゼンテーション情報を取得する

図からプレゼンテーションの情報を取得する

図(IDiagram)のメソッドであるgetPresentations()を利用して、 図に配置されたプレゼンテーションを取得します。

ProjectAccessor prjAccessor = AstahAPI.getAstahAPI().getProjectAccessor();
prjAccessor.open("C:a.asml", true, false, true);
IModel project = prjAccessor.getProject();
IDiagram[] diagrams = project.getDiagrams();
for (int i = 0; i < diagrams.length; i++) {
    IPresentation[] iPresentations = diagrams[i].getPresentations();
}

モデルから図要素の情報を取得する

モデル(IElement)のメソッドgetPresentations()を利用してプレゼンテーションを取得します。