モデル / プレゼンテーションの編集
編集を行う場合は必ずトランザクション処理が必要となります。
なお、下記条件を満たしていない場合は例外が発生します。
- プロジェクトアクセサにプロジェクトを登録していること
- 編集APIが対応しているエディションであること
- 対象が編集可能であること
トランザクション処理
トランザクションはastah*のプロジェクトに対して行われる更新処理の単位です。
beginTransactionメソッドがトランザクションの開始、endTransactionメソッドがトランザクションを確定させる処理です。 beginTransactionメソッドからendTransactionメソッドまでが1つの更新処理となり、undo/redoした場合はこの処理単位で行われます。 abortTransactionメソッドがトランザクションを取消す処理です。トランザクションを取消した場合、プロジェクトはトランザクション開始前の状態に戻ります。 例外処理で必ずabortTransactionメソッドを呼ぶようにしましょう。
ITransactionManager transactionManager = projectAccessor.getTransactionManager();
try {
transactionManager.beginTransaction();
// 編集処理(省略)
transactionManager.endTransaction();
} catch (BadTransactionException e) {
transactionManager.abortTransaction();
// 処理(省略)
}モデルの編集
モデルエディタ
モデルの編集はモデルエディタ(ModelEditor)を使用して行います。 ファセット(Facet)毎にモデルエディタ(ModelEditor)があります。例えば、SysML関連モデルの作成はSysmlModelEditorから作成できます。 モデルとプレゼンテーションが1:nで対応するモデルは各種モデルエディタから作成できます。

下記以外に、プレゼンテーションの作成と同時に時に一緒に作成されるモデルがあります。これについては図・プレゼンテーションの編集をご覧ください。
| モデルエディタの種類 | 作成可能要素 |
|---|---|
| BasicModelEditor | クラス、成果物、関連、関連クラス、属性、コンポーネント、制限、コピー、依存、導出、汎化、インタフェース、モデル、ノード、操作、パッケージ、パラメタ、ポート、限定子、実現、洗練、要求、満足、サブシステム、タグ付き値、テンプレートバインディング、テンプレートパラメタ、テストケース、トレース、使用依存、検証 |
モデルにパッケージを作成する
// 要トランザクション処理
public IPackage createPackage(ProjectAccessor projectAccessor, IModel parent, String name)
throws InvalidEditingException {
IModelEditorFactory modelEditorFactory = projectAccessor.getModelEditorFactory();
SysmlModelEditor sysmlModelEditor = modelEditorFactory.getSysmlModelEditor();
return sysmlModelEditor.createPackage(parent, name);
}モデルを削除する
// 要トランザクション処理
public void deleteElement(SysmlModelEditor sysmlModelEditor, IElement element)
throws InvalidEditingException {
sysmlModelEditor.delete(element);
}ブロックに定義を設定する
// 要トランザクション処理
public void setDefinition(IBlock block, String definition)
throws InvalidEditingException {
block.setDefinition(definition);
}モデルにステレオタイプを追加する
// 要トランザクション処理
public void addStereotype(IElement element, String stereotype) throws InvalidEditingException {
element.addStereotype(stereotype);
}図・プレゼンテーションの編集
ダイアグラムエディタ
図およびプレゼンテーションの作成や削除はダイアグラムエディタ(DiagramEditor)を使用して行います。
DiagramEditor は基本的に事前に図を設定することが必要です。
図を作成すると DiagramEditor にその図が自動的に設定されますが、既存の図を編集する場合は DiagramEditor#setDiagram(IDiagram diagram) を用いて図を設定します。

| ダイアグラムエディタの例 | 編集可能図 |
|---|---|
| BlockDefinitionDiagramEditor | ブロック定義図 |
| RequirementDiagramEditor | 要求図 |
| GsnDiagramEditor | GSN / D-Case図 |
| StampDiagramEditor | コントロールストラクチャー図 |
図を作成する
SysMLのブロック定義図の作成を例にします。
// 要トランザクション処理
public IBlockDefinitionDiagram createBlockDefinitionDiagram(BlockDefinitionDiagramEditor editor, INamedElement owner,
String name) throws InvalidEditingException {
return editor.createBlockDefinitionDiagram(owner, name);
}プレゼンテーションを作成する
SysMLのブロック定義図にブロックプレゼンテーションの作成を例にします。
// 要トランザクション処理
public INodePresentation createNodePresentation(BlockDefinitionDiagramEditor editor, IBlockDefinitionDiagram diagram, IElement model,
Point2D location) throws InvalidEditingException {
editor.setDiagram(diagram);
return editor.createNodePresentation(model, location);
}モデルとの対応が1:1となるプレゼンテーションを作成する
ステートマシン図の状態等、モデルとプレゼンテーションの対応が1:1となる場合、プレゼンテーションを作成するとモデルも一緒に作成されます。
// 要トランザクション処理
public INodePresentation createStatePresentation(StateMachineDiagramEditor editor, String name,
INodePresentation parent, Point2D location) throws InvalidEditingException {
return editor.createState(name, parent, location);
}プレゼンテーションを削除する
// 要トランザクション処理
public void deletePresentation(DiagramEditor editor, IPresentation presentation)
throws InvalidEditingException {
editor.deletePresentation(presentation);
}プレゼンテーション情報を変更する
プレゼンテーション情報(背景色等)の変更はPresentationPropertyConstants、PresentationPropertyUtilを使用します。
モデルとプレゼンテーションの対応関係については対応プレゼンテーション一覧をご覧ください。

プレゼンテーションの背景色を変更する
// 要トランザクション処理
public void changeColor(IPresentation presentation, final String color)
throws InvalidEditingException {
presentation.setProperty(Key.FILL_COLOR, color);
}プレゼンテーションの位置を変更する
// 要トランザクション処理
public void setLocation(INodePresentation presentation, Point2D location)
throws InvalidEditingException {
presentation.setLocation(location);
}