ObjectId を使用する(.NET)

データベース内に含まれる各オブジェクトには一意の ID が割り当てられます。オブジェクトには次の方法でアクセスできます。

オブジェクトにアクセスする最も一般的な方法は、ObjectId です。ObjectId は、プロジェクトで COM 相互運用と管理された AutoCAD .NET API の両方を利用している場合に問題なく機能します。カスタム AutoLISP 関数を作成する場合は、エンティティ ハンドルを使用する必要があります。

ハンドルは AutoCAD セッション間で維持されるので、後で図面の更新に使用する必要のある外部ファイルに図面情報を書き出す必要がある場合は、オブジェクトにアクセスする最善の方法です。データベースのオブジェクトの ObjectId は、データベースがメモリにロードされている間のみ存在します。データベースを閉じると、オブジェクトに割り当てられている ObjectId は存在しなくなり、次にデータベースを開いたときには異なる可能性があります。

ObjectId を取得する

オブジェクトを使用するときは、クエリーまたは編集するためにオブジェクトを開く前に、ObjectId を取得する必要があります。図面ファイルを開くとデータベースの既存オブジェクトに ObjectId が割り当てられ、新しいオブジェクトを作成すると ObjectId が割り当てられます。データベースの既存オブジェクトの ObjectId は一般に次のようにして取得します。

オブジェクトを開く

ObjectId を取得した後は、GetObject 関数を使用して、特定の ObjectId が割り当てられたオブジェクトを開きます。オブジェクトを次のいずれかのモードで開くことができます。

オブジェクトにアクセスする状況に最も適したモードでオブジェクトを開く必要があります。書き込みのためにオブジェクトを開くと、元に戻す操作のためのレコードを作成する必要があるため、追加のオーバーヘッドが発生します。開くオブジェクトが目的のものかはっきりしない場合は、読み込み用に開いた後、UpgradeOpen 関数を使用して読み込みから書き込みにモードを変更します。

GetObject 関数と Open 関数はどちらもオブジェクトを返します。一部のプログラミング言語では、値が割り当てられている変数に基づいて、返された値をキャストする必要があります。VB.NET では、自動的に行われるので返された値のキャストについて心配する必要はありません。

Dynamic Runtime Language (DLR)を使用しているときは、読み込みまたは書き込みのためにオブジェクトを開くことを気にする必要はありません。オブジェクトを開くことは透過的に処理され、オブジェクトに対して行われた変更をコミットするプロセスもトランザクションを使用しないで透過的に処理されます。

次の例では、現在のデータベースの画層 0 の LayerTableRecord を取得する方法を示します。

VB.NET

次の例では、不要になったトランザクションを手動で破棄します。

Dim acCurDb As Document = Application.DocumentManager.MdiActiveDocument.Database
Dim acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
 
Dim acLyrTblRec As LayerTableRecord
acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero, OpenMode.ForRead)
 
acTrans.Dispose()

次の例では、Using ステートメントを使用して、不要になったトランザクションを破棄します。Using ステートメントは推奨されるコーディング スタイルです。

Dim acCurDb As Document = Application.DocumentManager.MdiActiveDocument.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
    Dim acLyrTblRec As LayerTableRecord
    acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero, OpenMode.ForRead)
End Using

C#

次の例では、不要になったトランザクションを手動で破棄します。

Document acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
Transaction acTrans = acCurDb.TransactionManager.StartTransaction();
 
LayerTableRecord acLyrTblRec;
acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero,
                                OpenMode.ForRead) as LayerTableRecord;
 
acTrans.Dispose();

次の例では、Using ステートメントを使用して、不要になったトランザクションを破棄します。Using ステートメントは推奨されるコーディング スタイルです。

Document acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
    LayerTableRecord acLyrTblRec;
    acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero,
                                    OpenMode.ForRead) as LayerTableRecord;
}