備忘録代わりに。
AutoCAD のハンドルはオブジェクトIDと違ってその図面中でしか有効ではありませんが、セッションが中断しても(いいかえれば AutoCADを終了しても)そのオブジェクトが生きている限り変更されることのない値です。
従ってオブジェクト同士のリンクを保持するのに便利ですが、.NET API からの操作はすべてオブジェクトIDを使用しなければならないため、変換する必要があります。
このときに使用されるのが Database.GetObjectId() メソッドです。
さて、ハンドルはどんなに無茶な値からでもインスタンスを生成することができますが、それを元にしたオブジェクトIDを使うわけにいきません。
ということはエラーチェックが重要になりますが、GetObjectId() の使い方で方針が変わります。
1. 例外を利用する
GetObjectId() の第一引数に false を与えると、第二引数にハンドルが指定された場合に例外が飛びます。
あとはこれを catch するなり何なりと。
2. とりあえず無効なObjectIdを作る
こっちが本題。
GetObjectId() の第一引数に true を与えると、第二引数にハンドルが指定された場合でも、とりあえずオブジェクトIDを作ってくれます。
このオブジェクトIDは IsErased == false, IsNull == false, IsValid == true なので、一見すると有効なオブジェクトIDです。
しかし IsEffectivelyErased == true ですので、これで見分けることができます。
てことで、long なハンドル値をオブジェクトIDに変換するサンプルです。
handle_value にいろいろな意味で無効な値を与えると、ObjectId.Null を返します。
public static ObjectId ToObujetId( Database db, long handle_value )
{
Handle handle = new Handle( handle_value );
ObjectId ret_objid = db.GetObjectId( true, handle, 0 );
if( ret_objid.IsEffectivelyErased || ret_objid.IsErased ||
ret_objid.IsNull || !ret_objid.IsValid )
{
ret_objid = ObjectId.Null;
}
return ret_objid;
}