はじめに
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が必要です

初期ヒープサイズ16MB、最大ヒープサイズ256MBの指定:
-Xms16m -Xmx256m
サンプルアプリケーション
astah* SysML APIを使ったサンプルアプリケーションをGitHubで公開しています。
ぜひご活用ください。
利用手順は下記の通りです。
- astah* Plug-in SDKをインストールします をのコンパイルと実行に使います)
- 使いたいサンプルをgithub上のリポジトリからクローンします
- cloneで出来たフォルダを、コンソール上で作業フォルダに指定します
- ビルドを実行します
astah-build
- コマンドを実行します
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): モデル名と種類で検索する
- findElements(Class elementKind): 要素の種類で検索する
- findElements(ModelFinder picker)
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()を利用してプレゼンテーションを取得します。