以前のブログ記事では、AutoCAD 2004 以降、DWG と DXF の図面ファイル形式とアドオン アプリケーションの互換性が、3 バージョン毎に改められていることをご紹介しました。この考えに沿って考えれば、AutoCAD 2015 は、2 バージョン前の AutoCAD 2013 から続くサイクルの最後のバージョンになるので、図面ファイル形式は 2013 DWG 形式に、アドオン アプリケーション は AutoCAD 2013 用と AutoCAD 2014 用のアプリケーションと上位互換を持つことになります。
実は、AutoCAD 2015 は内部的に大きな変更が加えられたバージョンとなってしまったため、残念ながら、このシナリオが一旦崩れることになりました。図面ファイル形式は、AutoCAD 2013 のまま互換性を維持しますが、 AutoCAD 2013/2014 用に作成されたアドオン アプリケーションには移植作業が必要となります。
ここでは、AutoCAD 2015 で加えられた内部的な変更点とその影響について、その概要をご案内します。また、AutoCAD 2015 の機能について把握されていない場合には、次のリンクからブログ記事を一読していただくことをお勧めします。
移植作業と言っても、大規模な改修作業と言うより小規模な改修と考えていただくほうが適切です。ObjectARX や AutoCAD .NET API を使ったアドオン アプリケーションでも、旧バージョンで綿密なエラー処理を実装しているような場合には、新しい環境で再ビルドするだけで済むかもしれません。
開発環境
AutoCAD 2015 は、引き続き、32 ビット版と 64 ビット版の Windows をサポートします。ObjectARX アプリケーションを開発する場合は、従来通り、32 ビット版と 64 ビット版の両方を区別してビルドしてください。なお、ObjectARX SDK for AutoCAD 2015 は、http://www.autodesk.com/objectarx から無償でダウンロードすることが出来ます。
ObjectARX と AutoCAD .NET API の開発でサポートされる環境は、次のとおりです。
- Microsoft® Windows® 7 Enterprise、Professional、Ultimate の各エディション
または、Windows 8/8.1 Enterprise、Pro の各エディション - Microsoft® Internet Explorer® 9 または、それ以降
- Microsoft® Visual Studio® 2012 (Update 4)
- .NET Framework 4.5
AutoCAD 2015 では、いままでのバージョンのように、起動直後に図面を表示する子ウィンドウは表示されません。既定では [新しいタブ] が表示されます。ObjectARX や AutoCAD .NET API を使ったアプリケーションでアクティブなドキュメント(AcApDocument、Document)や図面データベース(AcDbDatabase、Database)を参照している場合には、図面が表示されていない状態、つまり、ゼロドキュメント状態 を想定したプログラム改修が必要です。例えば、現在アクティブな図面データベースの取得を実装している場合には、acdbHostApplicationServices()->workingDatabase() や HostApplicationServices.WorkingDatabase の戻り値が、null、Null、Nothing(言語によって異なる)でないことを明示的に確認する必要があります。
ファイバー削除の影響
AutoCAD 2015 で最も大きな内部的な変更は、このファイバー削除です。 ファイバーとは、古いバージョンの Windows OS など、オペレーティング システム レベルでマルチタスクを実装する初期の手段として利用されてました。
AutoCAD 上では、AutoCAD の親ウィンドウ内に複数の図面子ウィンドウを表示することが出来るようになった AutoCAD 2000 から、ファイバーを使ってコマンド実行中の図面子ウィンドウの切り替えをサポートしてきました。しかし、Microsoft 社は、ファイバーのサポートを既に停止しているため、AutoCAD 内部の実装からファイバーを使った処理を削除する必要がありました。その削除が、今回の AutoCAD 2015 で実行された訳です。
次の動画は、ファイバー削除によって影響を受ける AutoCAD 動作の違いを示してます。ファイバーが削除された AutoCAD 2015 では、コマンド実行中のコマンド切り替えがサポートされなくなります。AutoCAD 2000~AutoCAD 2014 では、コマンド実行中に図面子ウィンドウ(ドキュメント)を切り替え、また、元のドキュメントに切り替えても、実行中だったコマンド処理に復帰することが出来ますが、AutoCAD 2015 では、ドキュメント切り替え時に実行中だったコマンドは、AutoCAD によって強制的にキャンセルされるようになります。
ファイバー削除は、AutoCAD ネイティブ コマンドを呼び出している ObjectARX アプリケーションに影響を与えます。acedCommand()/acedCmd() 関数でコマンドを呼び出している場合には、acedCommandS()/acedCmdS() または、acedCommandC()/acedCmdC() のいずれかの関数に置き換える必要があります。acedCommandS() と acedCommandC() を利用する場合の区別は、acedCommand() 内で PAUSE キーワードを使ってユーザ操作を待機する処理をしているか否かです。
acedCommand(RTSTR, _T(“_Line”),
RTSTR, _T("0,0"),
RTSTR, _T("111,111"),
RTSTR, _T(""),
RTNONE);
のように、コマンドの実行がacedCommand() 関数内で完結している場合には、acedCommand() 関数を acedCommandS() 関数に置き換えれば移植は完了です。
void foo(void)
{
acedCommand(RTSTR, _T("_Line"),
RTSTR, _T("0,0"),
RTSTR, _T("111,111"),
RTNONE);
while(isLineActive())
acedCommand(RTSTR, PAUSE, RTNONE);
}
のような場合には、acedCommandC() 関数でコマンド呼び出しを置き換えた上で、PAUSE にあたる箇所をコールバック関数として実装する必要があります。
void foo(void)
{
acedCommandC(&myCallbackFn, NULL,
RTSTR, _T(“_Line”),
RTSTR, _T("0,0"),
RTSTR, _T("111,111"),
RTNONE);
}
int myCallbackFn(void * pData)
{
int nReturn = RTNONE;
if (isLineActive())
nReturn = acedCommandC(&myCallbackFn, NULL,
RTSTR, PAUSE,
RTNONE);
}
return nReturn;
}
static Adesk::Boolean isLineActive()
{
struct resbuf rb;
acedGetVar(_T("CMDNAMES"),&rb);
if (_tcsstr(rb.resval.rstring, _T("LINE")))
return Adesk::kTrue;
return Adesk::kFalse;
}
ObjectARX で acedCommandS()、acedCommandC() 関数を利用する場合には、 acedCmdNF.h をインクルードする必要があります。このヘッダーファイルには、ANSI コードではないコードが混入している問題がレポートされていますので対処が必要です。。詳細は、次のドキュメントをご参照ください。
QA-8870 ObjectARXアプリケーションのビルド時にSDK内のヘッダーでwarning C4819エラーになる
AutoLISP で (command) 関数を利用している場合には、(command-s) 関数か (command) 関数を使い分ける必要があります。ユーザ対話なしでコマンドを完結できる場合には、(command) 関数を (command-s) 関数 に置き換えてください。詳細は、こちら をご参照ください。
.NET API では、ファイバー削除にともなって、それまでサポートされていなかったネイティブ コマンドの実行が Editor.Command メソッド と Editor.CommandAsync メソッドによってサポートされるようになりました。2つのメソッドの関係は、前述の ObjectARX の acedCommandS() と acedCommandC() の関係と同様です。従来は Editor にコマンド呼び出しをサポートするメソッドが存在していなかったため、ObjectARX の acedCommand() や acedCmd() を P/Invoke で利用したり、Document.SendStringToExecute メソッドでコマンドを呼び出す実装が必要でした。
ダークテーマ
必須ではありませんが、メニューカスタマイズで独自のボタンを用意されている場合には、ダークテーマに対応できるよう、アイコンイメージをダークテーマに対応すべきです。ダークテーマとライトテーマで利用するビットマップ リソースを管理する方法も提供されます。
ワークスペース
AutoCAD 2015 には、プルダウンメニューやツールバーで構成された「AutoCAD クラシック」ワークスペースが削除されています。ただし、プロダウンメニューやツールバーなどのユーザ インタフェースは、AutoCAD 2015 でも表示して利用することが出来ます。AutoCAD クラシック相当のワークスペースの作成方法は、次の Autodesk Knowledge Network に記されています。
Autodesk AutoCAD 2015 でクラシック表示にすることができますか?
個々の移植方法については、今後のセミナーやブログ記事で扱う予定です。
By Toshiaki Isezaki
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。