モデルの一括検証
概要
Next Design エクステンションを開発すれば、モデルの情報を入力に、任意の検証処理を実装して、エラー箇所を表示する機能を実現できます。
以下では、.NET DLL方式による実装方法で、モデル検証のための UI ボタンを追加して、そのボタンを押下すると全モデルを一括検証して、エラー箇所を表示するエクステンションを作成してみましょう。
全体の流れ
- .NET DLL 開発プロジェクトの準備
- マニフェストによるエクステンションと拡張ポイントの定義
- リボン UI 用アイコンファイルの追加
- 全モデルの検証処理の実装
公開サンプル
本チュートリアルの結果として作成されるソースコード一式を GitHub で公開しています。
外部リンク: ValidationSample-1
ゴールイメージ
Next Design のサンプルプロジェクトから [先進運転システムソフト開発] プロジェクトを開くと、リボンに [My Extensions] タブが追加され、エクステンションの機能が有効になります。
リボンから [My Extensions] > [モデル検証] > [検証] ボタンを押下すると、次の検証ルールに従って全モデルが一括検証されて、エラー箇所が表示されます。
検証ルール: モデル名に半角スペース文字が含まていないこと
表示されているエラーをクリアするには、リボンから [ホーム] > [モデル] > [エラーチェック] > [エラークリア] をクリックします。
.NET DLL 開発プロジェクトの準備
Visual Studioで .NET DLL 開発プロジェクトを新規作成して、エクステンションのデバッグ環境を準備する手順を、次の順に説明します。
- Visual Studio での新しいプロジェクトの作成
- エクステンション開発用 DLL のインストール
ここでは、Visual Studio 2019 (以下、VS)での操作手順を説明します。
なお、以下の説明ではインストールフォルダがデフォルトとなっていることを前提としています。 異なる場合は、実際のインストールフォルダに置き換えてください。
デフォルトのインストールフォルダ:
C:\Program Files (x86)\DENSO CREATE\Next Design
VS での新しいプロジェクトの作成
.NET DLL の開発プロジェクトを新規作成するには、次の手順で行います。
操作手順
- VS を起動し、スタートページから [新しいプロジェクトの作成] をクリックして、[新しいプロジェクトの作成] ウィザードを開きます。
- プロジェクトテンプレートから C# による [クラス ライブラリ] を選択して [次へ] ボタンを押下します。
- [新しいプロジェクトを構成します] で、下記表に従って項目を入力して [次へ] ボタンを押下します。
- [追加情報] で、下記表に従って [ターゲットフレームワーク] を選択して [作成] ボタンを押下します。
- これにより、C# によるクラスライブラリ開発の VS プロジェクトのひな型が新規作成されます。
- ひな型として作成されたファイルのうち、
Class1.cs
ファイルは使用しません。VS のソリューションエクスプローラーから削除してください。
項目 | 値 |
---|---|
プロジェクト名 | ValidationSample |
場所 | プロジェクト一式を格納する任意の親フォルダ |
ソリューション名 | ValidationSample |
ターゲットフレームワーク | .NET Core 3.1 |
note
事前に次のパッケージをインストールしておく必要があります。
.NET Core 3.1 SDK
https://dotnet.microsoft.com/download/dotnet/3.1
エクステンション開発用 DLL のインストール
エクステンション開発に必要な NuGet パッケージをインストールには、次の手順で行います。
操作手順
Visual Studio のソリューションエクスプローラからプロジェクトの[依存関係]を選択し、コンテキストメニューから[NuGetパッケージの管理]を実行します。
パッケージソースを
nuget.org
になっていることを確認し、[参照]タブでNextDesign
と入力してパッケージを検索します。一覧表示されたパッケージの中から次のパッケージをインストールします。
NextDesign.Desktop
NextDesign.Core
マニフェストによるエクステンションと拡張ポイントの定義
マニフェストを新規作成するには、VS プロジェクトに新しい項目としてテキストファイル: manifest.json
を新規作成して、次の内容を定義します。
- 実行プログラムのエントリーポイント定義
- エクステンションのライフサイクル定義
- エクステンションの対象プロファイル指定
- UI の拡張ポイント定義(リボンタブ・グループ・ボタン)
- コマンドの拡張ポイント定義
マニフェストファイルの新規作成
VS プロジェクトに新しい項目としてテキストファイル: manifest.json
を新規作成するには、次の手順で行います。
操作手順
- VS のソリューションエクスプローラーから VS プロジェクトを右クリックして、コンテキストメニューの [追加] > [新しい項目] コマンドを実行します。
- 追加する項目の種類から [テキスト ファイル] を選択して、[名前] 入力フィールドに
manifest.json
を入力して [追加] ボタンを押下します。 - これにより、空の
manifest.json
ファイルが新規作成され、VS のソリューションエクスプローラーにも表示されます。
実装コード
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",
"command": "Command.Validation.Run" // 後述のコマンドに定義される検証コマンドの id を指定します。
}
]
}
]
}
]
},
// コマンド
"commands": [
// 検証処理のコマンドハンドラ `Run` を呼び出す検証コマンドを定義します。
{
"id": "Command.Validation.Run",
"execFunc": "Run", // エントリーポイントのメインクラスに実装される公開メソッドを指定します。
"canExecWhen": {
"uiState": "ProjectOpened" // コマンドの有効条件としてプロジェクトが開いていることを指定します。
}
}
],
// イベント
"events": {
}
}
}
リボン UI 用アイコンファイルの追加
前述のマニフェストで検証実行ボタンの imageLarge
に指定した UI ボタン用アイコンファイルを VS プロジェクトに追加するには、次の手順て行います。
操作手順
- VS プロジェクトの直下に
resources
サブフォルダを作成します。 - 作成したサブフォルダに
icon.png
ファイルを格納します。
(icon.png
ファイルのサンプルは、概要に記載したダウンロードファイルに含まれています) - VS のソリューションエクスプローラーにもアイコンファイルを登録したい場合は、
resources
サブフォルダをソリューションエクスプローラーの VS プロジェクトの上にドラッグ&ドロップします。
(この操作は任意です。アイコンファイルを登録しなくても問題ありません)
info
- 大きいアイコンのサイズは 32 x 32 を、小さいアイコンのサイズは 16 x 16 を推奨します。
全モデルの検証処理の実装
エクステンションのエントリーポイントと検証処理を実装するには、VS プロジェクトに新しい項目としてクラス: ValidationSample
を新規作成して、次の内容を実装します。
- 参照するAPIの名前空間の宣言
- エントリーポイントとなる DLL のメインクラス
- 検証処理のコマンドハンドラ(公開メソッド)
- エクステンションの初期化処理・終了処理
クラスの新規作成
VS プロジェクトに新しい項目としてクラス: ValidationSample
を新規作成するには、次の手順で行います。
操作手順
- VS のソリューションエクスプローラーから VS プロジェクトを右クリックして、コンテキストメニューの [追加] > [クラス] コマンドを実行します。
- 追加する項目の種類で [クラス] を選択されていることを確認して、[名前] 入力フィールドに
ValidationSample
を入力して [追加] ボタンを押下します。 - これにより、
ValidationSample.cs
ファイルのひな型が新規作成され、VS のソリューションエクスプローラーにも表示されます。
実装コード
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)
{
// 必要に応じてエクステンションの終了処理などを実装します。
}
}