AutoCAD 2015 の ObjectARX で acedCommand のマイグレーション情報

Autodesk Support

2017年8月2日


Issue
AutoCAD 2014 までの acedCommand を使ったネイティブな AutoCAD のコマンドを再利用するプログラムが、ファイバーが無い AutoCAD 2015 の ObjectARX で 動作しなくなりました。
ObjectARX ではカスタマイズに合わせて ACRX_CMD_TRANSPARENT, ACRX_CMD_MODAL, ACRX_CMD_SESSION,の3種類の実行コンテキストで動作するカスタムコマンドのほかに、Lispで認識するコマンドも作成していますが、全 て動作しません。
動作させる方法はありますか?
また、マイグレーションする場合に注意点などはありますか?


Solution
移行の案内は ObjectARX 2015 SDK のDocsホルダー内の”readarx.chm”に「acedCommand Migration」項として掲載されていますが、記述の内容は、マイグレーションに必要な "acedCmdNF.h" ヘッダーファイル内に記述されている内容と同じです。
(ファイバーが無くなった製品になる事で、過去のネイティブな AutoCAD のコマンドを再利用した処理ロジックの置き換えができないアルゴリズムも多く発生しますので、充分ご注意いただけますよう宜しくお願い申し上げます。)

今回は、”readarx.chm” の「acedCommand Migration」項に記載されていない、マイグレーション時の重要なポイントを記載させていただきますので、添付のプロジェクトと併せて参考にしてください。

1.acedCommandS や acedCmdS ステートメントはネイティブなコマンドシーケンスを完結した状態で情報を用意し、一気に送り出して実行させる事以外はご使用できません。

カスタムコマンドを実行し、その中でネイティブなコマンドを再利用し、さらに PAUSE などでオペレータの介入を待つような場合には、一切この acedCommandS や acedCmdS ステートメントはご使用になれません。
これは、仮に、コマンドの動作を複数の acedCommandS や acedCmdS ステートメント行に分割して動作させようとしても、それぞれの acedCommandS や acedCmdS ステートメントが終了した時点でAutoCAD側の解析は終了した事になりますので、最初が”LINE”コマンドであっても、次の開始点を acedCommandS や acedCmdS ステートメントで送り出しても、AutoCAD側は”LINEコマンド”との関連性は断たれていますので、意図する動作とはなり得ない事を意味します。

添付プロジェクトの ArxModalSTest1、ArxModalSTest2、ArxTranceSTest1、ArxTranceSTest2、LispSTest1、LispSTest2 コマンドを参照。

2.acedCommandC や acedCmdC ステートメントは、コールバック内で繰り返し与える(呼び出される)方式になりますが、気をつけなければならないのは、「ちょうどモードレスダイアログの時のような動作」の振る舞いになる。

呼び出し元の acedCommandC や acedCmdC ステートメント上で留まってコールバック関数内で処理をし、コールバック関数内の処理を抜けてきたら、呼び出し元の acedCommandC や acedCmdC ステートメントの次のステートメントに移るというインボーク動作(コールバックに積み込んだステートメントをサブルーチンとして動作させる)をしている訳 では無く、呼び出し元の acedCommandC や acedCmdC 実行後の次の瞬間には呼び出し元の acedCommandC や acedCmdC の次のステップが実行される事です。
AutoCAD は acedCommandC や acedCmdC で呼び出されたコールバックにて非同期で動作させる結果となっていますので、このコールバック内では「キャンセルか?」「コマンドは何が動いていたの か=LINEだったか?」を判定し、「呼び出されたコールバック関数を引数に更に acedCommandC や acedCmdC ステートメントを呼び出す」といったロジックにする必要があります。

添付プロジェクトの ArxModalCTest1、ArxModalCTest2、ArxTranceCTest1、ArxTranceCTest2 コマンドを参照。

3.acedCommandC と acedCmdC は、登録する「カスタムコマンドの種類と状態」で、コールバック関数内の処理の手続きが異なる。

acedRegFunc の LISP で認識させるカスタムコマンドと addCommand で登録したコマンドではコールバック関数内の振る舞いが異なります。
また、ACED_ADSSYMBOL_ENTRY_AUTO にて Lisp で認識可能な形式で登録されたコマンド内では、第3引数を True (acedRegFunc() で登録)する必要がある。
例:
ACED_ADSSYMBOL_ENTRY_AUTO(CAdnacedCommandCSampleApp, LispCTest1, true)
ACED_ADSSYMBOL_ENTRY_AUTO(CAdnacedCommandCSampleApp, LispCTest2, true)

これは、AutoCAD 側製品のコマンドスタックの振る舞いの違いに影響されているもので、わかりやすく伝えると acedRegFunc 登録された LISP などで認識されているコマンドにおいて、コールバック内でネイティブな AutoCAD コマンドの再利用中に再利用のコマンドを終了させた場合、コマンドスタック制御の戻り先は最初に呼び出されたカスタムコマンドになりますので、カスタムコ マンドから抜けられなくなる API と製品側の使用制限による振る舞いを持ちます。
つまり、コールバック関数内でネイティブなコマンドの再利用中に処理途中のコマンドを正常な動作で終了させるには「キャンセル」による方法で、コマンドス タック内の状態をもとにクリアにして AutoCAD コア側に戻すといった手法( AutoCAD 2015 製品では、ドキュメントを切り替えた瞬間に動作中のコマンドがキャンセルされるといった製品側の動作に準じる)しかない事です。
コールバック関数内では、「ESCキー」に限定したコマンドキャンセル監視のための acedCmdCWasCancelled ステートメントの存在や、acedCallBackOnCancel によるキャンセル処理を再度呼び出す際の振る舞いなどのいくつかの手順を踏んでも、これらを怠ると、一回目は正常に終了したかに思えますが、同じ acedRegFunc で登録されたコマンドを実行させようとしても「; エラー: ADS 要求エラー」が現れ、AutoCAD 製品を終了しない限り、2度と実行はできなくなります。
この場合、 acedRegFunc の LISP で認識させるカスタムコマンドで動作中のコールバック関数内からの抜け出しは強制的に acedPostCommand(_T("CANCELCMD")); を使い、非同期で再利用動作中のネイティブな AutoCAD コマンドを強制終了させる方法になります。

添付プロジェクトの LispCTest1、LispCTest2 コマンドを参照。

4.ACED_ARXCOMMAND_ENTRY_AUTO にて ACRX_CMD_SESSION(アプリケーション実行コンテキスト)で登録されたコマンド内では、acedCommandS・ acedCommandC・acedCmdS・acedCmdC に置き換えても動作しません。

ただし、acDocManager->sendStringToExecute ステートメントを使い、再利用コマンドの完全シーケンスを用意し、一気に動作させる事のみ可能。
(再利用コマンド内で PAUSE などで止めるようなアルゴリズムは作成できない事を意味します)

添付プロジェクトの ArxSessionSTest1, ArxSessionCTest1, ArxSessionSTest2, ArxSessionCTest2, ArxSessionSTest3 コマンドを参照
 
5.MDI 動作中に「ドキュメント実行コンテキストで登録されたコマンド」(疑似マルチスレッド)の動作の振る舞いが無くなった。

わかりやすい例としてはAutoCAD2014まではAutoCADで2つのDWGを開いておき、一方でLINEコマンドを実行し一点目を入力した時点で ラバーバンドがでている状態でDWGを他方に移動し、もう一方のDWGでcircleコマンドを実行させ中心点を指示した時点でラバーバンドが出ている状 態で、DWGをそれぞれ切り替えると、それぞれ別のコマンドが動作しているといった振舞になっていましたが、AutoCAD2015よりコマンド動作中に 画面を切り替えた瞬間に、非アクティブになった画面のコマンドは「自動的にキャンセル」されます。
(=これは非常に重要な点ですので、周知いただけますようお願い申し上げます)

添付のプロジェクト内でご覧いただけます、過去、日本語に翻訳した配布させていただいておりましたドキュメント「ファイバ動作を削除した AutoCAD 環境への移行」API Migration Guide for Fiberless Operations (newsletter article) 日本語翻訳版v2.pdf の中にも、ご案内させていただいておりますが、ファイバーの無い製品になった時には、製品側自体の内部動作仕様が大幅に変化しますので、緊急避難的な状態 以外のご使用は避けるのが賢明であり、決して「旧 acedCommand ステートメントを UI の中心や ObjectARX や .NetManaged API をご利用になられて、LISP と同等のネイティブな AutoCAD のコマンド再利用を処理の中心に置いた安易なカスタマイズ」は再検討をいただけますよう宜しくお願い申し上げます。

尚、添付の Visual Studio 2012 プロジェクト ( AdnacedCommandCSample.zip ) が開けない場合は、ObjectARX Wizard 2015で作成したプロジェクトが他のPCで開けない を参照してください。

By Shigekazu Saito



この情報は役に立ちましたか?


サポートが必要な場合は、Autodesk Assistant にお問い合わせください!

Assistant が回答を見つけたり、担当者に連絡するお手伝いをします。


オートデスクではどのようなサポートが提供されますか?

ご利用可能なサポートの種類は、サブスクリプションのプランによって異なります。現在のプランでご利用可能なサポート レベルをご確認ください。

サポート レベルを確認