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

モデルの一括検証

概要

Next Design エクステンションで、モデルの情報を入力に任意の検証を実施してエラー表示するチュートリアルです。
リボンにボタンを追加して、そのボタンを押下すると全モデルを一括検証して、エラー箇所を表示するエクステンションを .NET DLL 方式で作成してみましょう。

全体の流れ

  • .NET DLL 開発プロジェクトの準備
  • マニフェストによる拡張ポイントの定義
  • 全モデルの検証処理の実装

公開サンプル

  • 本チュートリアルの結果として作成されるソースコード一式を GitHub で公開しています。

    外部リンク: ValidationSample-1

ゴールイメージ

モデル名の一括検証

  • Next Design のサンプルプロジェクトから [先進運転システムソフト開発] プロジェクトを開くと、リボンに [My Extensions] タブが追加され、エクステンションの機能が有効になります。

  • リボンから [My Extensions] > [モデル検証] > [検証] ボタンを押下すると、次の検証ルールにしたがって全モデルが一括検証されて、エラー箇所が表示されます。

    検証ルール: モデル名に半角スペース文字が含まていないこと

  • 表示されているエラーをクリアするには、リボンから [ホーム] > [モデル] > [エラーチェック] > [エラークリア] をクリックします。

備考
  • [先進運転システムソフト開発] が見当たらない場合は、拡張機能の BasicSamples パッケージ をインストールしてください。
    公式の拡張機能のインストールについてはこちらを参照してください。

.NET DLL 開発プロジェクトの準備

Visual Studioで .NET DLL 開発プロジェクトを新規作成して、エクステンションのデバッグ環境を準備する手順を、次の順に説明します。

  • Visual Studio での新しいプロジェクトの作成
  • エクステンション開発用 DLL のインストール
  • マニフェストファイルの新規作成
  • クラスの新規作成
  • リボン UI 用アイコンファイルの追加

ここでは、Visual Studio 2022 (以下、VS)での操作手順を説明します。

VS での新しいプロジェクトの作成

.NET DLL の開発プロジェクトを新規作成するには、次の手順で行います。

VS での新しいプロジェクトの作成

操作手順
  1. VS を起動し、スタートページから [新しいプロジェクトの作成] をクリックして、[新しいプロジェクトの作成] ウィザードを開きます。
  2. プロジェクトテンプレートから C# による [クラス ライブラリ] を選択して [次へ] ボタンを押下します。
  3. [新しいプロジェクトを構成します] で、下記表にしたがって項目を入力して [次へ] ボタンを押下します。
  4. [追加情報] で、下記表にしたがって [ターゲットフレームワーク] を選択して [作成] ボタンを押下します。
  5. これにより、C# によるクラスライブラリ開発の VS プロジェクトのひな型が新規作成されます。
  6. ひな型として作成されたファイルのうち、Class1.cs ファイルは使用しません。VS のーソリューション エクスプローラーから削除してください。
項目
プロジェクト名ValidationSample
場所プロジェクト一式を格納する任意の親フォルダ
ソリューション名ValidationSample
ターゲットフレームワーク.NET 8.0
注記

ターゲット OS を設定する

プロジェクトのプロパティで、ターゲット OS を「Windows」に設定します。

エクステンション開発用 DLL のインストール

エクステンション開発に必要な NuGet パッケージをインストールには、次の手順で行います。

操作手順
  1. Visual Studio のソリューション エクスプローラーからプロジェクトの[依存関係]を選択し、コンテキストメニューから[NuGetパッケージの管理]を実行します。
  2. パッケージソースをnuget.orgになっていることを確認し、[参照]タブでNextDesignと入力してパッケージを検索します。
  3. 一覧表示されたパッケージの中から次のパッケージをインストールします。

    NextDesign.Desktop
    NextDesign.Core

マニフェストファイルの新規作成

VS プロジェクトに新しい項目としてテキストファイル: manifest.json を新規作成するには、次の手順で行います。

マニフェストファイルの新規作成

操作手順
  1. VS のソリューション エクスプローラーから VS プロジェクトを右クリックして、コンテキストメニューの [追加] > [新しい項目] コマンドを実行します。
  2. 追加する項目の種類から [テキスト ファイル] を選択して、[名前] 入力フィールドに manifest.json を入力して [追加] ボタンを押下します。
  3. これにより、空の manifest.json ファイルが新規作成され、VS のソリューション エクスプローラーにも表示されます。

クラスの新規作成

VS プロジェクトに新しい項目としてクラス: ValidationSample を新規作成するには、次の手順で行います。

クラスの新規作成

操作手順
  1. VS のソリューションエクスプローラーから VS プロジェクトを右クリックして、コンテキストメニューの [追加] > [クラス] コマンドを実行します。
  2. 追加する項目の種類で [クラス] を選択されていることを確認して、[名前] 入力フィールドに ValidationSample を入力して [追加] ボタンを押下します。
  3. これにより、ValidationSample.cs ファイルのひな型が新規作成され、VS のソリューションエクスプローラーにも表示されます。

リボン UI 用アイコンファイルの追加

検証実行ボタン用アイコンファイル: icon.png を VS プロジェクトに追加するには、次の手順で行います。

リボン UI 用アイコンファイルの追加

操作手順
  1. VS プロジェクトの直下に resources サブフォルダを作成します。
  2. 作成したサブフォルダに icon.png ファイルを格納します。
    icon.png ファイルのサンプルは、公開サンプルのソリューションに含まれています。)

マニフェストによる拡張ポイントの定義

拡張ポイントを定義するには、マニフェストファイルの新規作成で作成したマニフェストに、次の内容を定義します。

  • 実行プログラムのエントリーポイント定義
  • エクステンションのライフサイクル定義
  • エクステンションの対象プロファイル指定
  • UI の拡張ポイント定義(リボンタブ・グループ・ボタン)
  • UI 用アイコンファイルの指定
  • コマンドの拡張ポイント定義

実装例

manifest.json

{
// エクステンション定義
"name": "Validation Sample",
"version": "1.1.0",
"publisher": "DENSO CREATE INC.",
"license": "Next Design 使用許諾契約書に準ずる。Copyright (C) 2019 DENSO CREATE INC. All rights reserved.",

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

// 拡張ポイント定義
"extensionPoints": {
// リボン
"ribbon": {
"tabs": [
// エクステンション用に追加するリボンタブを定義します。
{
"id": "MyExtensions.MainTab",
"label": "My Extensions",
"orderAfter": "System.Help",
"groups": [
// リボンタブ内を区切るグループを定義します。
{
"id": "MyExtensions.Validation.Group",
"label": "モデル検証",
"controls": [
// 検証実行ボタンを定義します。
{
"type": "Button",
"id": "MyExtensions.Validation.RunButton",
"label": "検証",
"description": "全モデルを検証します。",
"imageLarge": "resources/icon.png", // UI 用アイコンファイルを指定します。
"command": "Command.Validation.Run" // 後述のコマンドに定義される検証コマンドの id を指定します。
}
]
}
]
}
]
},

// コマンド
"commands": [
// 検証処理のコマンドハンドラ `Run` を呼び出す検証コマンドを定義します。
{
"id": "Command.Validation.Run",
"execFunc": "Run", // エントリーポイントのメインクラスに実装される公開メソッドを指定します。
"canExecWhen": {
"uiState": "ProjectOpened" // コマンドの有効条件としてプロジェクトが開いていることを指定します。
}
}
],

// イベント
"events": {
}
}
}

全モデルの検証処理の実装

エクステンションのエントリーポイントと検証処理を実装するには、クラスの新規作成で作成したクラスに、次の内容を実装します。

  • 参照するAPIの名前空間の宣言
  • エントリーポイントとなる DLL のメインクラス
  • 検証処理のコマンドハンドラ(公開メソッド)
  • エクステンションの初期化処理・終了処理

実装例

ValidationSample.cs

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

/// <summary>
/// エントリーポイントとなるDLLのメインクラス
/// </summary>
/// <remarks>
/// エントリーポイントのメインクラスには、 `IExtension` インタフェースを実装します。
/// ハンドラはこのクラスの公開メソッドとして実装します。
/// </remarks>
public class ValidationSample : IExtension
{
/// <summary>
/// 検証処理のコマンドハンドラ
/// </summary>
/// <param name="context">コマンドコンテキスト</param>
/// <param name="parameters">コマンドパラメータ</param>
/// <remarks>
/// 検証処理のコマンドハンドラをメインクラスの公開メソッドとして実装します。
/// </remarks>
public void Run(ICommandContext context, ICommandParams parameters)
{
var app = context.App;
var project = app.Workspace.CurrentProject;

// 以前のエラーをすべてクリアします。
app.Errors.ClearErrors();

// エラー一覧ウィンドウを表示します。
app.Window.IsInformationPaneVisible = true;
app.Window.ActiveInfoWindow = "Error";

// プロジェクト中のすべてのモデルを対象に繰り返し処理を行います。
var models = project.GetAllChildren();
foreach (var model in models)
{
// 検証ルールに従ってモデルを検証します。
ValidateModel(model);
}
}

/// <summary>
/// 検証ルールに従ってモデルを検証
/// </summary>
/// <param name="model">モデル</param>
private void ValidateModel(IModel model)
{
// 次の検証ルールと照合します。
// ・モデル名には半角スペースを含めないこと
if (model.Name.IndexOf(" ") > 0)
{
// 検証ルールに合わない場合は、該当モデルにエラー情報を追加します。
var message = string.Format("モデル名に半角スペースが含まれています。モデル名: {0}", model.Name);
var error = model.AddError("Name", "Error", "モデル命名規則チェック", message);
}
}

/// <summary>
/// エクステンションの初期化処理
/// </summary>
/// <param name="context">実行コンテキスト</param>
/// <remarks>
/// エクステンションの初期化処理・終了処理が不要な場合も、空の `Activate`, `Deactivate` メソッドが必要です。
/// </remarks>
public void Activate(IContext context)
{
// 必要に応じてエクステンションの初期化処理などを実装します。
}

/// <summary>
/// エクステンションの終了処理
/// </summary>
/// <param name="context">実行コンテキスト</param>
/// <remarks>
/// エクステンションの初期化処理・終了処理が不要な場合も、空の `Activate`, `Deactivate` メソッドが必要です。
/// </remarks>
public void Deactivate(IContext context)
{
// 必要に応じてエクステンションの終了処理などを実装します。
}
}