Next Design V5.1 の変更点
エクステンション機能の変更点
プロジェクトを開く処理の高速化
プロジェクトを開く処理が高速化されました。これまではプロジェクト内のすべてのモデルファイルを読み込んでからプロジェクトが開きましたが、表示に必要な情報を先に読み込んで表示し、残りのモデルファイルはバックグラウンドで読み込むようになりました。NDCli や拡張機能SDKのランタイムからプロジェクトを開く場合も、同様に高速化されます。
これに伴い、モデルファイルを必要になったときに読み込む方式に変わり、スクリプトやエクステンションから見た動作が一部変わります。
- 次の操作を行うと、必要なモデルファイルが自動で読み込まれてから処理が続行されます。そのため、従来よりも実行時間がかかる場合があります。
- 未読み込みのモデルの表示
- モデルのフィールド 値の取得・設定
- タグ値の取得・設定
- プロジェクト全体のモデルを参照する機能(検索・置換、エラーチェックなど)の実行 ※読み込まれるのは自動ロード設定のモデルファイルのみです。手動ロードのモデルファイルは従来通り自動で読み込まれません。
- モデル名(Name)の取得だけでは読み込みは発生しません。ただし、モデルの表示名を、タグ名「System.Name」を付与した別のフィールドで定義しているクラスでは、その値の取得で読み込みが発生します。
- モデルファイルのロード状態の取得と、すべてのモデルのロードを行う API を追加しました。
- IProject.AutoLoadStatus プロパティで、自動ロードの状態(実行中/完了/エラー中断)と、ロードに失敗したモデルファイルの一覧を取得できます。
- IProject.RealizeAll メソッドで、プロジェクト内のすべてのモデルをロードできます。プロジェクト全体を横断して参照するスクリプトの実行前に呼び出すことで、途中の読み込み待ちを避けられます。
イベントの発生タイミングの変更とバックグラウンド自動ロード後イベントの追加
- エクステンションのプロジェクトオープン後イベント(onAfterOpen)・リロード後イベント(onAfterReload)は、バックグラウンドの読み込みが完了する前に 発生するようになりました。これらのイベントハンドラでプロジェクト全体のモデルを参照すると、必要なモデルファイルの読み込みが発生し、プロジェクトを開く時間が長くなることがあります。
- バックグラウンドの読み込み完了後に発生する「バックグラウンド自動ロード後イベント(onAfterAutoLoad)」を追加しました。プロジェクトのオープン・リロードごとに 1 回発生し、プロジェクト全体のモデルを参照する処理の移行先として利用できます。
- 画面の操作で手動ロード設定のモデルファイルが読み込まれたときも、追加ロード後イベント(onAfterModelUnitLoad)が発生するようになりました。V5.0 では明示的なロードで必ず発生していたため、読み込みの完了をエクステンションから検知できるようにしています。
- エクステンションが、オープン後・リロード後イベントやコマンドの実行可否判定(CanExecute)で多数のモデルファイルの読み込みを発生させ、プロジェクトを開く時間や操作の応答が長くなっている場合は、情報ペインに警告(エクステンション名・イベント・読み込んだファイル数・所要時間)が表示されるようになりました。
コマンドの実行可否判定への影響
- コマンドの実行可否判定(CanExecute)でモデルのフィールド値を参照すると、未読み込みのモデルファイルの読み込みが発生し、プロジェクトオープン直後の操作の応答が遅くなることが あります。フィールド値に依存する判定は、コマンド実行時(Execute)に行うことを推奨します。
手動ロード設定のモデルファイルに対する動作
手動ロード設定のモデルファイルのモデルは、プロジェクトを開いた時点からモデルナビゲータやトレースに表示されるようになりました。一方で、エクステンション・スクリプト・ND-MCP から見える範囲と見え方は V5.0 から変えていないため、V5.0 向けに作成したエクステンションやスクリプトは、変更せずにそのまま利用できます。ただし、次の 2 点は V5.0 と動作が異なります(後述)。ID を指定したモデルの取得の戻り値と、配下にモデルファイルの基点モデルがあるモデルの削除です。
これらの動作は、Next Design 本体で動作するスクリプトやエクステンションで、手動ロード設定のモデルファイルがあるプロジェクトを扱う場合のものです。NDCli や拡張機能SDKのランタイムは手動ロード設定を読み込まず、Enterprise 以外のエディションでは手動ロード設定を無視するため、未読み込みのモデルが生じません。
手動ロード設定と自動ロード設定については、Next Design ユーザーズマニュアルの モデルファイルの部分ロード を参照してください。
- 手動ロード 設定で未読み込みのモデルファイルのモデルは、所有階層・パス・名前検索(GetChildren / GetAllChildren / FindChildrenBy* / GetModelByPath)には現れません。ロード済みの親を持つ基点モデルだけが、親の子・パスに「(未ロード)」のプロキシモデルとして現れ、その配下は現れません(V5.0 と同じです)。親も未読み込みなら基点モデルも現れません。未読み込みのモデルファイルに保存されている関連も列挙されません。
- ロード済みのモデルからの関連先、参照フィールドの値、ID を指定した取得では、未読み込みのモデルはプロキシモデル(IsProxy が true)として返ります。プロキシモデルは、名前が「(未ロード)」、子と関連はたどれず、フィールドの値は既定値、タグはなしで、変更はできません。モデルファイルが読み込まれると、同じモデルがそのまま通常のモデルになります。
- ID を指定してモデルを取得したとき、ロード済みのモデルから参照されていない未読み込みのモデルは、V5.0 では null が返っていましたが、V5.1 ではプロキシモデルが返ります。
- 手動ロード設定で未読み込みのモデルファイルのモデルについて、フィールド値や名前を参照してもモデルファイルは読み込まれません。読み込まれるのは、画面の操作と、明示的に読み込む API(モデルファイルを指定して読み込む IWorkspace.LoadModelUnits メソッド)だけです。オンデマンドロードの設定や、検索・エラーチェックの実行中かどうかにはよりません。プロジェクト全体を横断して処理する場合は、IWorkspace.LoadModelUnits メソッドで読み込んでから実行してください。
- 名前は、実名ではなく「(未ロード)」 が返ります(表示名を System.Name タグ付きの別フィールドで定義しているクラスは空文字。V5.0 と同じです)。自動ロード設定でまだ読み込まれていないモデルは実名が返ります(表示名が別フィールドのクラスは、その取得で読み込みが発生します)。
- 未読み込みのモデルへの変更(フィールドやタグの設定、モデルの追加・移動・削除、関連先への指定など)は、モデルファイルを読み込まずにエラーになります。例外の型は V5.0 と同じで(自身への変更は ExtensionInvalidOperationException、指定モデルに渡した場合は ExtensionInvalidModelException、可否系は false)、メッセージは読み込んでいないため変更できない旨を示します。読み込み済みかどうかは IModel.IsRealized で判定できます。変更する場合は、IProject.RealizeAll メソッドなどで読み込んでから実行してください。
- ロード済みのモデルの削除や関連の解除で、相手が未読み込みのモデルの場合は、モデルファイルを読み込まずに関連を切り離します。未読み込み側のモデルファイルには関連が残ります(V5.0 と同じです)。
- 配下に手動ロード設定のモデルファイルの基点モデルがあるモデルは、エクステンションやスクリプトから削除できません(エラー「モデルファイルとして指定されているモデルは削除することが出来ません」)。V5.0 では削除でき、親のないモデルファイルが残っていましたが、親のないモデルファイルを作らないように V5.1 では拒否します。画面の操作と同じ扱いです。削除する場合は、配下のモデルファイルを統合するか、モデルファイルの登録を解除してから実行してください。
制約事項
- タグの有無を判定する API(HasTags / GetTag / Tags の列挙)とタグを削除する API(RemoveTag)は、モデルファイルの読み込みを行いません。未読み込みのモデルに対しては、モデルファイルにタグが設定されていても「タグなし」(false / null / 空)として動作し、RemoveTag は何も行いません。タグ値を取得する GetTagValue は、自動ロード設定のモデルファイルでは読み込みを行ったうえで正しい値を返しますが、手動ロード設定のモデルファイルでは読み込みを行わず、タグなしとして扱います(V5.0 と同じです)。タグの有無で判定する場合は、自動ロード設定のモデルファイルでは先に GetTagValue でタグ値を取得し、手動ロード設定のモデルファイルでは IProject.RealizeAll メソッドなどでモデルを読み込んでから判定してください。
- フィールド値の件数を取得する API(Count)は、モデルファイルの読み込みを行いません。未読み込みのモデルの値フィールドは、常に 0 件を返します。他モデルへの参照フィールドの件数は、自動ロード設定のモデルファイルでは読み込み前でも正しく取得できますが、手動ロード設定のモデルファイルでは関連も見えないため 0 件になります。プロジェクトオープン直後に件数の集計や検証を行う場合は、自動ロード設定のモデルファイルでは先にフィールド値を取得し、手動ロード設定のモデルファイルでは IProject.RealizeAll メソッドを呼び出して、モデルを読み込んでから判定してください。
- モデルファイルの読み込みが完了す る前に、スクリプトからプロジェクト全体を横断してモデルを参照すると、自動ロード設定のモデルファイルの読み込み待ちにより、スクリプトの実行時間が長くなることがあります。手動ロード設定のモデルファイルは参照しても読み込まれないため、待ち時間は生じません。バックグラウンド自動ロード後イベント(onAfterAutoLoad)でロード完了済みであることを通知しますので、これをご利用ください。
- プロジェクト間の差分比較の API は、V5.0 と同じ扱いです。プロジェクト全体の比較は、読み込んでいないモデルファイルがあると実行できません。モデルファイルを指定した比較は、指定したモデルファイルがすべて読み込み済みであれば実行できます。指定していない未読み込みのモデルファイルは、比較の対象外です。すべてを対象にする場合は、事前に IProject.RealizeAll メソッドなどで読み込んでください。
ExtensionPoints の変更点
- バックグラウンド自動ロード後イベント(onAfterAutoLoad)を、C# 版・Python 版の型付き API から購読できるようにしました。C# 版では RegisterOnAfterAutoLoad<T> メソッドとハンドラ基底クラス ProjectAfterAutoLoadEventHandlerBase(イベントパラメータからプロジェクト、自動ロードの状態、読み込みに失敗したモデルファイルを取得できます)、Python 版では on_after_auto_load を使用します。
- 追加ロード後イベント(onAfterModelUnitLoad)の購読 API が型付き API に不足していたため、同様に追加しました。C# 版では RegisterOnAfterModelUnitLoad<T> メソッドとハンドラ基底クラス ProjectAfterModelUnitLoadEventHandlerBase、Python 版では on_after_model_unit_load を使用します。
- 新しいイベントに対応していないバージョンの Next Design 上でも、エクステンションの初期化が例外にならないようにしました(未対応のイベントは登録が無視され、発生しません)。
- サンプルエクステンションのマニフェストスキーマに上記のイベントを追加しました。
- ExtensionPoints を用いたエクステンションで使用するデフォルトのアイコンを埋め込みリソースに変更しました。そのため、エクステンション実行時、リソースフォルダにデフォルトのアイコンが出力されないようになります。
- ExtensionPoints を使って作成したプロジェクトをビルドすると NextDesign.Desktop の参照バージョンが見つからないという警告が出る問題を解消しました。
API ごとの変更点
ここでは、Next Design V5.1 のAPI変更点を列挙します。それぞれの API の詳細は API 仕様 を参照してください。
変更した API
Next Design V5.1 で変更したAPIを列挙します。
API 移行方法の詳細 は API 仕様から該当 API の注釈を参照してください。
NextDesign.Core
| API | 変更内容 |
|---|---|
| IMetamodels.Relate メソッド | Agentiqs の「Next Design プロファイル編集」エージェントから実行するときに、モデルエディタに関連元または関連先クラスのインスタンスが表示されており、かつエディタのインジケータ表示が有効な場合に、内部で処理が失敗し、そのまま編集を続けると不正なプロファイルとなる問題を解消しました。 |
| IModel.Delete メソッド | 配下に手動ロード設定のモデルファイルの基点モデルがあるモデルは、削除できずエラーになるようになりました。 |
| IProject.GetModelById メソッド | 手動ロード設定で未読み込みのモデルファイルのモデルを ID で取得したとき、ロード済みのモデルから参照されていない場合も、null ではなくプロキシモデルを返すようになりました。 |
NextDesign.Desktop
| API | 変更内容 |
|---|---|
| プロジェクトオープン後イベント(onAfterOpen) | バックグラウンドの読み込みが完了する前に発生するようになりました。 |
| プロジェクトリロード後イベント(onAfterReload) | バックグラウンドの読み込みが完了する前に発生するようになりました。 |
| 追加ロード後イベント(onAfterModelUnitLoad) | 画面の操作で手動ロード設定のモデルファイルが読み込まれたときも発生するようになりました。 |
追加した API
Next Design V5.1 で追加したAPIを列挙します。
NextDesign.Core
- IModel.IsRealized プロパティ
- IProject.AutoLoadStatus プロパティ
- IProject.RealizeAll メソッド
NextDesign.Desktop
- バックグラウンド自動ロード後イベント(onAfterAutoLoad)
NextDesign.Desktop.ExtensionPoints
- RegisterOnAfterAutoLoad<T> メソッド(C# 版)
- ProjectAfterAutoLoadEventHandlerBase クラス(C# 版)
- on_after_auto_load(Python 版)
- RegisterOnAfterModelUnitLoad<T> メソッド(C# 版)
- ProjectAfterModelUnitLoadEventHandlerBase クラス(C# 版)
- on_after_model_unit_load(Python 版)
ExtensionPoints ライブラリの API の詳細は ライブラリ > ExtensionPoints を参照してください。
V5.1 では、APIの削除および統廃合予定はありません。