AutoCAD API を使ったアドオン アプリケーションの移植性 でもご案内したことがありますが、移植性の容易さから、特に明確な理由がない限り、プログラム開発を生業にしているプロフェッショナル開発者の方には、AutoCAD .NET API の利用をお勧めしています。決して、他の AutoCAD API が無くなってしまうとか、使用をお勧めしない、とかいうことではありません。それだけ、AutoCAD .NET API が高機能で柔軟性を備え、メンテナンスコストのも優れている、という意味です。
ただ、難易度が高い ObjectARX には、.NET API にない高度な機能が存在するのも事実です。よく説明で触れるのは、ObjectARX でしか定義することが出来ないカスタム オブジェクトです。これ以外にも、ObjectARX がサポートしていて、AutoCAD .NET API でサポート出来ていないものがあります。キーボードの特定キー押下やマウスボタンのクリックを検出する OS レベルのイベント処理です。
Windows などの GUI ベースの OS が、イベント ドリブン(event driven)な処理体系を持っているのはご存じと思います。例えば、Windows の使用中には、常にイベントの発生を知らせるメッセージが各アプリケーションに通知されています。アプリケーションは、特定のメッセージに反応して各種処理をしています。ウィンドウ上でマウスの左ボタンをクリックしたか、右ボタンをクリックしたかも、異なるメッセージで通知してくれます。開発用の監視ツールでは、このようなメッセージを監視することも出来ます。
AutoCAD 上で OS レベルのイベント メッセージを処理するイベント ハンドラを登録する ObjectARX 関数に、メッセージ監視の開始をトリガする acedRegisterFilterWinMsg() 関数と、メッセージ監視を終了する acedRemoveFilterWinMsg() 関数が用意されています。
これらを使用すると、ZOOM や PAN といったコマンド操作を抑止しながら、長尺帳票を扱うようなことが出来るようになります。(この例では列車ダイヤ図)
具体的には、モデル空間の長尺な図形情報を、レイアウト上に用意した 3 つの異なる浮動ビューポートでモデル空間の図形領域を特定サイズで表示、メインの浮動ビューポート上で左ボタンを押しながら移動させたマウスの位置を取得して、他の 2 つの浮動ビューポートの表示位置をリアルタイムに変化させることが可能になります。
AutoCAD .NET API では、 作図領域上にあるクロスヘアカーソル位置の座標は、InputPointMonitor イベントで取得することが出来ます。
AutoCAD .NET API :クロスヘア カーソル位置座標の取得
ただ、マウス ボタンやキーボード キーのイベントを同時に処理することは出来ないため、ObjectARX の acedRegisterFilterWinMsg() 関数と acedRemoveFilterWinMsg() 関数を利用出来れば便利です。
このようなやむを得ない場面では、AutoCAD のインストール フォルダから ObjectARX 関数をエクスポーズしている DLL ファイルを探し出し、プラットフォーム呼び出し(P/Invoke)を使って .NET API コードで ObjectARX のグローバル関数を呼び出すことが可能です。
詳細は、下記の Autodesk Network Knowledge 記事を確認してみてください。
AutoCAD .NET API :ObjectARX 関数の P/Invoke
AutoCAD .NET API :マウス左ボタン クリックの検出
AutoCAD .NET API :キーボード ボタン押下の検出
ObjectARX は .NET Framework に管理されないアンマネージ コード、AutoCAD .NET API は .NET Framework 下のマネージ コードです。ガベージ コレクション等、メモリ管理に違いもありますので、あらゆるケースで期待した結果が保証されるものはありませんが、テストしてみる価値はあるかと思います。
By Toshiaki Isezaki
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。