development of

Tieghaに関する備忘録とおまけ

【IJCAD】Transaction.GetObject() と ObjectId.GetObject() はどちらが良いのか?

.NET APIでオブジェクトを開く手段としては以下の方法があります。

  1. Transaction.GetObject() メソッドを使用する
  2. ObjectId.GetObject() メソッドを使用する
  3. ObjectId.Open() メソッドを使用する

基本的に .NET API でオブジェクトを開く場合は1番目と2番目の GetObject() メソッドを使用することになり、トランザクションのコミット時にオブジェクトは閉じられます。

3番目のOpen メソッドには Obsolete 属性がついていて、代わりに GetObject() メソッドを使用することを推奨するメッセージが表示されます。

また余談ですが、AutoCAD の Open メソッドはトランザクションの外でもオブジェクトを開くことが出来ますが、IJCAD ではトランザクション内でなければ例外がスローされます。 Open メソッドで開いたオブジェクトは、Close メソッドを使用してオブジェクトを必ず閉じなければなりませんが、何にせよ Open メソッドは使用しない方が無難です。

1番目の Transaction.GetObject() メソッドと、2番目の ObjectId.GetObject() メソッドには大きな違いはありません。

AutoCAD の多くのサンプルコードでは、Transaction.GetObject() メソッドを使用することが多いですが、 これはトランザクションを使用してオブジェクトを開くことを強調するだめだと思われます。

adndevblog.typepad.com

ObjectId.GetObject() メソッドも実際には現在のトップトランザクションを取得し、Transaction.GetObject() メソッドによってオブジェクトを開いています。 その為 Transaction.GetObject() メソッドの方がObjectId.GetObject() メソッドよりも効率的で、IJCAD も ObjectId.GetObject() メソッドを使用した場合、Transaction.GetObject() メソッドの1.1倍ほどの時間が掛かってしまいます。

しかし、ObjectId.GetObject() メソッドを使用する利点は大いにあります。

新しく図形を作図する場合や、数百万から数千万の膨大な数のオブジェクトを編集する場合で無い限りは、オブジェクトを扱うメソッドにトランザクションを渡すことや、メソッド内でトランザクションを取得する必要がなくなり、ObjectId.GetObject() メソッドの方がコーディングの量が減らすことができると考えられます。