メインコンテンツまでスキップ

モデル追加時の初期化処理の追加

プレビュー公開

本機能および本機能で利用する API は先行公開しているものです。 現時点で品質保証しておりませんので、ご利用される場合はユーザー様の責任でご利用ください。 また、これらの仕様は予告なく変更する場合がありますのでご了承ください。

概要

モデル追加時にユーザー独自の初期処理を追加することができます。プリミティブ型や列挙型のフィールドの値を設定するだけでなく、所有する子要素のモデル追加も可能です。

初期化処理を組み込むには次の実装が必要です。

  • 初期化処理のインタフェースの実装
  • 初期化処理の登録処理の実装

初期化処理のインタフェースの実装

以下のインターフェスを実装します。

インターフェースメソッド
IModelInitializationProviderInitializeProvider メソッド
InitializeFields メソッド

詳細は API 仕様をご参照ください。

note
  • 同じモデルに対して初期化処理のインターフェースを複数実装することが可能です。
  • 同じモデルに対する初期化処理は、登録された順にすべて適用されます。
  • ある初期化処理の実装で null を返した場合、次の初期化処理が適用されます。次の初期化処理がない場合、Next Design 標準の振る舞いが適用されます。

初期化処理の登録処理の実装

IExtention を実装したメインクラスの公開メソッド Activate に、初期化処理の登録処理を実装します。 Deactviate での登録解除処理の実装は不要です。

Activate メソッド : 初期化処理の登録

実装例

ModelInitializationEntryPoint クラスで IExtension インタフェースを実装する場合の例を示します。

IExtension の実装例

    public class ModelInitializationEntryPoint : IExtension
{
/// <summary>
/// エクステンションを活性化する。
/// </summary>
/// <param name="context">実行コンテキスト</param>
public void Activate(IContext context)
{
// 初期化処理を登録します。
var registry = context.App.Workspace.CurrentProject.EditingCapabilityProviderRegistry;
registry.Register(new ModelInitializationProvider());
}

/// <summary>
/// エクステンションを非活性化する。
/// </summary>
/// <param name="context">実行コンテキスト</param>
public void Deactivate(IContext context)
{
// 解除は不要です。
}
}

サンプル:子モデルの自動追加

モデル追加時の初期化処理のサンプルとして、モデル追加時に子モデルを自動追加する方法を説明します。 以下では、Visual Studio プロジェクトの新規作成から、実際に子モデルを自動追加する初期化処理を組み込むところまでを説明します。

全体の流れ

  • Visual Studio プロジェクトの新規作成
  • 初期化処理インタフェースの実装
  • 初期化処理登録処理の実装

公開サンプル

  • 以下の手順で作成されるサンプルのソースコード一式を GitHub で公開しています。

    外部リンク: ModelInitializationSample

ゴールイメージ

画面キャプチャ or GIFアニメ

  • Next Design のサンプルプロジェクトから [先進運転システムソフト開発] プロジェクトを開きます。
  • ユースケース図を開きユースケースを追加すると、自動で以下のモデルも追加されます。
    • シナリオ(名前:基本シナリオ)

Visual Studio プロジェクトの新規作成

モデル追加時の初期化処理の開発では、プロジェクト新規作成時にプロジェクトの種類として [クラスライブラリ] を選択します。

プロジェクト新規作成時の以下の設定は、チュートリアル > モデル一括検証 と同様です。

  • エクステンション開発用 DLL のコピー
  • エクステンション開発用 DLL の参照設定追加
  • デバッグ実行準備の自動化

マニフェストを新規作成し、定義します。 以下は、チュートリアル > モデル一括検証 と同様です。

  • 実行プログラムのエントリーポイント定義
  • エクステンションのライフサイクル定義
  • エクステンションの対象プロファイル指定

モデル追加時の初期化処理の実現では、マニフェストに以下の定義は不要です。

  • UI の拡張ポイント定義(リボンタブ・グループ・ボタン)
  • コマンドの拡張ポイント定義

実装コード

manifest.json

{
"name": "DensoCreate.NextDesign.Extensions.ModelInitializationSample",
"version": "1.0.0",
"publisher": "DENSO CREATE Inc.",
"license": "Next Design 使用許諾契約書に準ずる。Copyright (C) 2021 DENSO CREATE INC. All rights reserved.",

"main": "ModelInitializationSample.dll", // エントリーポイントとしてビルド結果の DLL ファイル名を指定します。
"lifecycle": "project", // ライフサイクルとしてプロジェクトライフサイクルを指定します。
"baseprofile": "車載システムソフト開発" // 対象プロジェクトの条件としてプロファイル名を指定します。
}

初期化処理インタフェースの実装

初期化処理を実現するクラスを追加し、次のインターフェースを実装します。

実装するインターフェース実装が必要なメソッド
IModelInitializationProviderInitializeProvider メソッド
InitializeFields メソッド

実装コード

IModelInitializationProvider を実装し、初期化時に子モデルを自動追加します。

ModelInitializationProvider.cs

using System;
using System.Collections.Generic;
using System.Text;
using NextDesign.Core;
using NextDesign.Core.EditingCapabilities;
using NextDesign.Desktop;

namespace ModelInitializationSample
{
class ModelInitializationProvider : IModelInitializationProvider
{
/// <summary>
/// 初期化処理の対象にするメタモデルを設定します
/// </summary>
/// <param name="context"></param>
public void InitializeProvider(IModelInitializationProviderInitializationContext context)
{
// 「UseCase」を初期化処理の対象として登録します
IClass usecaseClass = context.Project.Profile.Metamodels.FindClassesByName("UseCase").GetItem(0);
if (usecaseClass != null)
{
context.RegisterClass(usecaseClass);
}
}

/// <summary>
/// 指定したメタモデルの生成時に初期化処理を実行します
/// </summary>
/// <param name="initializeParams"></param>
public void InitializeFields(ModelInitializationParams initializeParams)
{
// モデルの複製の場合は何もしません
if (initializeParams.IsCloned)
{
return;
}
// ユースケースには必ず「基本シナリオ」を定義する設計ルールに対して、自動で子モデルを生成します
var model = initializeParams.Model;
var scenario = model.AddNewModel("Scenarios", "Scenario");
scenario.SetField("Name", "基本シナリオ");

}
}
}

初期化処理登録処理の実装

IExtention を実装したメインクラスの公開メソッド Activate に初期化処理の登録処理を実装します。メインクラスの公開メソッド Deactviate での登録解除処理は不要です。

実装コード

子モデルの自動追加を登録します。

ModelInitializationEntryPoint.cs

// エクステンション開発で参照するAPIの名前空間の宣言
using NextDesign.Extension;
using NextDesign.Core;
using NextDesign.Desktop;

namespace ModelInitializationSample
{
/// <summary>
/// モデル追加時の初期化処理のエクステンションエントリポイント。
/// </summary>
public class ModelInitializationEntryPoint : IExtension
{
/// <summary>
/// エクステンションを活性化する。
/// </summary>
/// <param name="context">実行コンテキスト</param>
public void Activate(IContext context)
{
// 初期化処理を登録します。
var registry = context.App.Workspace.CurrentProject.EditingCapabilityProviderRegistry;
registry.Register(new ModelInitializationProvider());
}

/// <summary>
/// エクステンションを非活性化する。
/// </summary>
/// <param name="context">実行コンテキスト</param>
public void Deactivate(IContext context)
{
// 制約の解除は不要です。
}
}
}