エクステンションとは
Next Design ではプログラミング言語から Next Design が提供している API を利用することでユーザが自由に機能拡張できます。これらの個々の機能を エクステンション と呼びます。Next Design のエクステンションを開発することで、次のような追加機能を実現可能です。
- 設計したモデルの整合性を検証し、エラーや警告を提示するような検証機能を実現できます。
- 既存資産のドキュメントからのインポート、シミュレーション用データ生成、独自形式のドキュメント出力といった、独自のインポート/エクスポート機能を開発できます。
- 外部ツールとのデータ連携によるツールチェーンを実現できます。
特徴
Next Design のエクステンションは次のような特徴があります。
スクリプトとDLLによる開発
エクステンションの開発言語は C# を用いています。言語としても洗練され、また近年オープン化も進んでLinux/Macやモバイルでも動作するようになっています。エクステンションの実装方法として次の2種類があり、エクステンションごとに選択できます。
- C# から .NET DLL にコンパイルする実装方法(推奨)
- C# スクリプトによる実装方法
Next Design のエクステンションはスクリプトでも実行時に動的にコンパイルされるので非常に軽快に動作しますが、DLLでの開発はライブラリも充実しており、またデバッグのしやすさや保守性を考えるとDLLでの開発を推奨します 。.NET DLL方式による実装方法ではイベント処理や UI 拡張など高度な機能拡張もできます。詳しくはスクリプトとDLLを参照して下さい。
// コマンドハンドラ
public void SayHello(ICommandContext context,ICommandParams commandParams)
{
App.Window.UI.ShowInformationDialog("Hello !","Hello World");
}
拡張ポイント
拡張ポイントとは、エクステンションで拡張するUIやイベントのことです。そのファイルをマニフェストファイルと呼びます(以降、単にマニフェストと記します)。 拡張ポイントは次のようにJsonにて定義します。
"extensionPoints": {
"commands": [
{
"id": "Command.SayHello",
"execFunc": "SayHello"
}
],
...
}
- リボン(メニュー)にボタンなどを追加して機能拡張できます。
- モデル編集操作やファイル操作などのイベントを受け取り、そのイベントを利用して機能拡張できます。
- エクステンションで拡張されるリボンやイベントの定義は、エクステンションごとに記述するマニフェストから読み込まれます。
エクステンションのライフサイクル
エクステンションは、アプリケーション起動と同時に有効にすることも、プロジェクトのプロファイルに応じてエクステンションを有効にすることも可能です。 また、一つのプロファイルに対して複数のエクステンションを有効にできます。
APIによる操作
Next Design のAPIを通してアプリケーションの様々な情報にアクセスでき、ユーザーインタフェースも操作できます。 例えば次のような操作が可能です。
// プロジェクトファイルを開きます
var filePath = "xxx.nproj";
Workspace.OpenProject(filePath);
// プロジェクトのすべての要素を取得します
var project = CurrentProject;
var children = project.GetAllChildren();
// 子孫要素の名前を情報ウィンドウの出力タブに出力します
foreach ( var child in children )
{
Output.WriteLine("sample",child.Name);
}
// 情報ウィンドウの出力タブをアクティブにします
Window.ActiveInfoWindow = "Output";
Window.CurrentOutputCategory = "sample";
- プロジェクトを開く、新規に作成する、保存する。
- アプリケーションの選択しているモデルを取得する、変更する。
- モデル情報にアクセスして、モデルを新規に追加したり更新する 。
- モデルを検証して個々のモデルにエラー情報を設定することでエラー箇所にメッセージを表示させる。
多言語対応
- Next Design のオプションにある表示言語の切り替えに連動して、エクステンションの表示言語を切り替えられるように多言語対応のメカニズムを提供します。
{
"locale": "ja",
"resourceStrings" : {
"MyExt.Tab.Label": "エクステンション",
"MyExt.ValidationGroup.Label": "モデル検証",
"MyExt.ValidationButton.Label": "検証",
"MyExt.ValidationButton.Description": "全モデルを検証します。",
"MyExt.Error.CanNotBeEmpty.Title": "空にできない",
"MyExt.Error.CanNotBeEmpty.Message": "名前フィールドは空にできません",
"MyExt.Error.CanNotChange.Message2": "{0}は{1}にできません"
}
}