通常、VBA IDE または Visual Studio で作成した AutoCAD オートメーション プロジェクトを AutoCAD 2016 で使用できるようにするためには、若干の更新が必要な場合があります。
ActiveX API に対して行われた変更の一般的な履歴は、「ActiveX API の履歴」を参照してください。
AutoCAD 図面環境や、Microsoft Word または Excel など VBA をサポートしているアプリケーションで作成された VBA プロジェクトでは、AutoCAD ActiveX API への参照を更新しなければならない可能性があります。AutoCAD ActiveX API を使用している Managed .NET および ObjectARX アプリケーションも、更新しなければならない可能性があります。
次の表に、AutoCAD ベースの製品のリリースごとにサポートされている AutoCAD オブジェクト ライブラリのファイル名を示します。
リリース | リリース番号 | AutoCAD タイプ ライブラリ | AutoCAD/ObjectDBX タイプ ライブラリ |
---|---|---|---|
AutoCAD 2016 | 20.1 | acax20<言語>.tlb | axdb20<言語>.tlb |
AutoCAD 2015 | 20.0 | acax20<言語>.tlb | axdb20<言語>.tlb |
AutoCAD 2014 | 19.1 | acax19<言語>.tlb | axdb19<言語>.tlb |
AutoCAD 2013 | 19.0 | acax19<言語>.tlb | axdb19<言語>.tlb |
AutoCAD 2012 | 18.2 | acax18<言語>.tlb | axdb18<言語>.tlb |
AutoCAD 2011 | 18.1 | acax18<言語>.tlb | axdb18<言語>.tlb |
AutoCAD 2010 | 18.0 | acax18<言語>.tlb | axdb18<言語>.tlb |
AutoCAD 2009 | 17.2 | acax17<言語>.tlb | axdb17<言語>.tlb |
AutoCAD 2008 | 17.1 | acax17<言語>.tlb | axdb17<言語>.tlb |
AutoCAD 2007 | 17.0 | acax17<言語>.tlb | axdb17<言語>.tlb |
AutoCAD 2006 | 16.2 | acax16<言語>.tlb | axdb16<言語>.tlb |
AutoCAD 2005 | 16.1 | acax16<言語>.tlb | axdb16<言語>.tlb |
AutoCAD 2004 | 16.0 | acax16<言語>.tlb | axdb16<言語>.tlb |
AutoCAD 2002 | 15.2 | acax15.tlb | axdb15.tlb |
AutoCAD 2000i | 15.1 | acax15.tlb | axdb15.tlb |
AutoCAD 2000 | 15.0 | acax15.tlb | axdb15.tlb |
次の表に、最新のリリースで使用されているその他の AutoCAD ActiveX API のファイル名、および最新のリリースで置き換えられたオブジェクト ライブラリ ファイルのファイル名を示します。
新しいオブジェクトは追加されませんでした。
既存のオブジェクトに対して行われた変更は、次の表のとおりです。
AutoCAD 2015 | AutoCAD 2016 | 変更の概要 |
---|---|---|
IAcadSection |
IAcadSection2 |
新しいプロパティを使用するには、IAcadSection2 を使用します。 |
IAcadDocument |
IAcadDocument |
SaveAs メソッドは、図面ファイルにパスワードを割り当てる機能をサポートしなくなりました。図面ファイルをパスワード保護しようとすると、エラーが発生します。必要に応じて、SaveAs メソッドが含まれていて IAcadSecurityParams オブジェクトを渡されるコード文を更新してください。 |
IAcadSecurityParams |
IAcadSecurityParams |
Algorithm、KeyLength、Password、ProviderName、ProviderType プロパティは廃止されました。これらのプロパティを使用しているプロジェクトは、更新する必要があります。 Action プロパティは、定数 ACADSECURITYPARAMS_ENCRYPT_DATA および ACADSECURITYPARAMS_ENCRYPT_PROPS、またはそれらと同じ値を受け入れなくなりました。 |
COM ライブラリ参照の更新に加えて、次の変更により旧リリースのプログラムをマイグレートしなければならない可能性があります。
たとえば、AutoCAD 2014 ベース以前の製品では次のように動作します。
ThisDrawing.SendCommand "._LINE " ThisDrawing.SendCommand "0,0 5,5 "
AutoCAD 2015 ベース以降の製品では、上記のコードは LINE[線分]コマンドを実行した後、ユーザが点を指定するまで待ちます。LINE[線分]コマンドが完了または終了した後、2 番目の SendCommand メソッドが実行されます。 正しく実行するには、以前のコードを次のように変更します。
ThisDrawing.SendCommand "._LINE 0,0 5,5 "
コード文を複数の行に分割する必要がある場合は、AcadDocument オブジェクトにコマンド文字列をポストし、その文字列を同期的に実行する PostCommand メソッドを使用できます。コマンド文字列の同期的実行とは、最も外側のプロシージャが実行され、AcadDocument オブジェクトがアイドル状態になったときに実行されることです。
64 ビット オペレーティング システムは、32 ビット アプリケーションと 64 ビット アプリケーションの両方を実行することができます。しかし、同じプロセス内で両方を混在させることはできません。たとえば、64 ビット プロセスで 32 ビット DLL をロードすることはできません。その逆も同じです。プロセスにロードされるすべての実行可能コンポーネント(EXE および DLL ファイル)は、プロセスのバイナリ タイプと一致していなければなりません。64 ビット アプリケーションの In-process コンポーネントは、可能な限り 64 ビット プロセスに移植する必要があります。
新しいオブジェクトを作成しようとすると、エラーが発生する可能性があります。VB の New キーワードは、64 ビット AutoCAD COM DLL をロードしようとします。VBA は 32 ビット アプリケーションなので、64 ビット DLL をロードすることはできません。たとえば、次のようなコードがあるとします。
Dim color As AcadAcCmColor Set color = New AcadAcCmColor
または
Dim color As New AcadAcCmColor color.SomeMethod()
これらのコードは、次のように修正して移植する必要があります。
Dim color As AcadAcCmColor Set color = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.20")
上の問題は、IDispatch から派生されたすべてのオブジェクトに対して AcadApplication.GetInterfaceObject("ProgIdOfAcAnyObject") を使用することによって解決できます。IUnknown から派生されたクラス(たとえば、AcSmSheetSet、AcSmSheetMgr など)は、64 ビット VBA マイグレーションがあることを予期していません。そのようなプロセスは、VB.NET. に移植することをお勧めします。
AutoCAD 2014 から、AutoCAD はネイティブ 64 ビット サポートを提供する VBA 7.1 に対応しています。この変更により、VBA プロジェクトの 2 つのバージョン(32 ビット版と 64 ビット版)を修正する必要があります。AutoCAD 2014 より前のリリースでは、VBA は、既存の 32 ビット VBA プロジェクトを AutoCAD 64 ビットで予期したように動作させるための 32 ビットから 64 ビットへの「変換」レイヤを使用してアクセスされる外部プロセス コンポーネントとして実行されていました。
VBA 64 ビットは、フォームに異なるライブラリおよびコントロールを使用する必要があります。すべての VBA ライブラリとフォーム コントロールが 64 ビットで使用できるとは限らず、Windows 32 ビットと Windows 64 ビットで正常に機能するように、コードの一部を調整する必要がある可能性があります。
VBA プロジェクトが AutoCAD 2009 から AutoCAD 2013 用に開発されている場合は、VBA プロジェクトの最新リリースにマイ グレートするときに、次の点を考慮する必要があります。
AutoCAD 2009 の 64 ビット版から AutoCAD 2013 の 64 ビット版まで、オブジェクト ID は 64 ビット整数型(__int64)で表現されます。これらの値に 32 ビット VBA でアクセスすると、コンパイル エラーが発生します。この解決策として、旧メソッド名の後ろに "32" を付け加えた新しいメソッド名(たとえば、ObjectID32()、OwnerID32())を使用します。これらのメソッドは、内部的に 64 ビット整数型に変換される LONG 型を使用します。
正確に言うと、VBA が必要とする各オブジェクト ID に対して、32 ビット オブジェクト ID が内部的に作成されます。この ID は、実際の 64 ビット ID に対応付けられており、VBA コードから AutoCAD に 32 ビット ID が返された場合、内部的には 64 ビット オブジェクト ID が返され、使用されます。
次に、32 ビット オブジェクト ID の移植コードの例を示します。
元のコード 64 ビット(AutoCAD 2009 から AutoCAD 2013 まで)
Dim splineObj As AcadSpline Dim objectID As Long objectID = splineObj.objectID32 Dim tempObj As AcadObject Set tempObj = ThisDrawing.ObjectIdToObject32(objectID)
AutoCAD 2014 の 64 ビット版以降の互換に移植したコード
Dim splineObj As AcadSpline Dim objectID As Long objectID = splineObj.objectID Dim tempObj As AcadObject Set tempObj = ThisDrawing.ObjectIdToObject(objectID)
VBA アプリケーションは、オブジェクト ID ではなく、オブジェクトのハンドルを使用することもできます。次の例に、オブジェクト ID の代わりにハンドルを使用する方法を示します。
オブジェクトのオブジェクト ID を使用した元のコード
Dim splineObj As AcadSpline Dim objectID As Long objectID = splineObj.objectID Dim tempObj As AcadObject Set tempObj = ThisDrawing.ObjectIdToObject(objectID)
オブジェクトのハンドルを使用した変更後のコード
Dim splineObj As AcadSpline Dim objectHandle As String objectHandle = splineObj.Handle Dim tempObj As AcadObject Set tempObj = ThisDrawing.HandleToObject(objectHandle)
AutoCAD 2009 の 64 ビット版から AutoCAD 2013 の 64 ビット版で 32 ビットの代わりに使用されたメソッドの一覧を次の表に示します。
64 ビット システムの VBA メソッド | ||
---|---|---|
メソッド - AutoCAD 2009 から 2013 | メソッド - AutoCAD 2014 以降 | 使用法 |
GetBlockAttributeValue32 | GetBlockAttributeValue | 32 ビット オブジェクト ID を使用して、ブロックに含まれる属性定義オブジェクトの指定したブロック セルの属性値を返します。 |
GetBlockTableRecordId32 | GetBlockTableRecordId | ブロックタイプ セルと nContent に関連付けられたブロック テーブル レコードの 32 ビット オブジェクト ID を取得します。 |
GetFieldId32 | GetFieldId | 指定したセルに関連付けられたフィールド オブジェクトの 32 ビット オブジェクト ID を返します。 |
GetGridLinetype32 | GetGridLinetype | グリッド線種オブジェクトの 32 ビット オブジェクト ID を返します。 |
Key32 | キー | 64 ビット システムに対する CopyObjects 操作で、ソース オブジェクトのオブジェクト ID を指定します。 |
ObjectID32 | ObjectID | 64 ビット システムのオブジェクト ID を取得します。 |
ObjectIDtoObject32 | ObjectIDtoObject | 64 ビット システムの指定したオブジェクト ID に対応するオブジェクトを取得します。 |
OwnerID32 | OwnerID | 64 ビット システムのオーナー(親)オブジェクトのオブジェクト ID を取得します。 |
SetBlockAttributeValue32 | SetBlockAttributeValue | 32 ビット オブジェクト ID を使用して、ブロックと nContent を含む属性定義オブジェクトの指定したブロック セルの属性値を設定します。 |
GetBlockTableRecordId32 | SetBlockTableRecordId | ブロックタイプ セルと nContent に関連付けられた 32 ビット オブジェクト ID ブロック テーブル レコードを設定します。 |
SetFieldId32 | SetFieldId | 指定したセルと nContent に関連付けられたフィールド オブジェクトの 32 ビット オブジェクト ID を設定します。 |
SetGridLinetype32 | SetGridLinetype | グリッド線種オブジェクトの 32 ビット オブジェクト ID を設定します。 |
Value32 | 値 | 64 ビット システムに対する、プロパティの現在値、または新しく作成されたクローン オブジェクトのオブジェクト ID を指定します。 |