development of

Tieghaに関する備忘録とおまけ

【IJCAD】コマンド実行コンテキストについて

コマンド実行コンテキストについて

.NET API でコマンドを定義するときに、IJCAD でも AutoCAD と同じようにコマンド実行コンテキストについて考慮する必要があります。

2つの実行コンテキスト

実行コンテキストには、ドキュメント実行コンテキスト アプリケーション実行コンテキストの2種類があります。

CommandFlags.Modal を指定したコマンドはドキュメント実行コンテキストで、CommandFlags.Session を指定したコマンドはアプリケーション実行コンテキストです。

ドキュメント実行コンテキストのコマンドは、基本的に現在アクティブな図面に対して実行されるコマンドで、コマンドの開始時と終了時は同一の図面がアクティブな状態です。

アプリケーション実行コンテキストのコマンドは、コマンドの処理内でアクティブな図面が変更され、ドキュメントを跨って処理が実行されるコマンドで、コマンドの開始時と終了時でアクティブな図面が異なる場合もあります。

実行コンテキストの使い分け

通常コマンドの実行は、現在アクティブな図面に対して処理を行うために実行されるので、基本的にドキュメント実行コンテキストでコマンドを定義します。

NEW コマンドや OPEN コマンドのように、新しいドキュメントを追加する時や、開いている複数の図面に対して一括に処理を行う時などは、アプリケーション実行コンテキストでコマンドを定義します。

また IJCAD に限った話ですが、Window Forms 内の処理にブレークポイントを追加しても、うまくデバッグできないという問題があります。 f:id:tknmt:20190529105632p:plain この場合にアプリケーション実行コンテキストでコマンドを定義すると、ブレークポイントで処理が止まるようになり、変数の中身などを確認できるようになります。

アプリケーション実行コンテキストの問題点

IJCAD のアプリケーション実行コンテキストにはいくつかの問題点があります。

AutoCAD では、アプリケーション実行コンテキストのコマンドで、図面のデータベースを編集する場合は、明示的にドキュメントをロックしないと例外が発生してしまいますが、IJCAD ではドキュメントをロックしていなくてもデータベースの編集ができてしまいます。

また、ユーザ入力で表示したメッセージなどがコマンド終了時にも表示されたままになったりします。

Window Forms 内のブレークポイントが止まらないというのは、開発を進めるにあたっての障害になりますが、開発が完了しアプリケーションをリリースする際には、可能な範囲でドキュメント実行コンテキストに変更したほうが、品質の高いアプリケーションを世に出せると思います。