作成日:2021.08.12
更新日:2021.08.12

IJCAD の .NET API を利用して、図形を編集する方法を紹介します。
API で図形を編集するには、図面データベースから図形オブジェクトを取得し、編集内容に応じて、図形オブジェクトのプロパティを変更します。
図面データベース内のオブジェクトに変更を加えるときは、オブジェクトのオープンモードに注意する必要があります。
ここでは、図形オブジェクトを編集するコマンドの作成を交えて、オープンモードとその変更方法について説明します。
IJCAD の API で、図形、画層、線種などの情報を取得するには、オブジェクトIDからオブジェクトを取得して、目的のクラスにキャストします。
オープンモードとは、取得したオブジェクトの利用目的に相当し、次のものがあります。
読み込みモードで取得したオブジェクトに変更を加えようとすると、コマンド実行時に例外が発生します。
また、オブジェクトを書き込みモードで取得すると、UNDO コマンドによる取り消しやトランザクションのロールバックを行う場合に備えて、オブジェクトへの変更内容を記録する処理が行われます。
このため、オブジェクトの情報を変更しない場合は、コマンドの実行時の処理のオーバーヘッドを避けるため、読み取りモードでオブジェクトを取得することが望ましいです。
.NET API では、オープンモードが OpenMode 列挙型として、次のように定義されています。
OpenMode.ForReadOpenMode.ForWriteOpenMode.ForNotifyオブジェクトを取得するときには、Transaction クラスのインスタンスにオブジェクトIDと OpenMode 列挙型の値を渡して、GetObject メソッドを呼び出します。
例として、モデル空間の図形の情報を読み取る処理の概略は、次のようになります。
using (var tr = db.TransactionManager.StartTransaction())
{
// ブロックテーブルを取得します。
var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
as BlockTable;
// モデル空間のレコードを取得します。
var btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead)
as BlockTableRecord;
// モデル空間の個々の図形に対して処理を行います。
foreach (ObjectId oid in btr)
{
// 図形オブジェクトを取得します。
var obj = tr.GetObject(oid, OpenMode.ForRead);
// 図形オブジェクトに対して処理を行います。
...
}
// トランザクションをコミットします。
tr.Commit();
}
上のプログラムでは、ブロックテーブルのオブジェクト、モデル空間のレコードのオブジェクト、図形オブジェクトを取得するときに GetObject メソッドを呼び出しており、オープンモードはすべて読み込みモード(OpenMode.ForRead)となっています。
モデル空間のレコードオブジェクトについて、図形の情報を取得するだけの場合はオープンモードを読み込みモードとしますが、図形を作図する場合には、モデル空間のレコードオブジェクトに変更が加わる(作図する図形のオブジェクトが追加されるため)ため、オープンモードを書き込みモードとします。
図面データベースからオブジェクトを取得した後でも、オープンモードを変更できます。
DBObject クラスには、オープンモードを変更するために次のメソッドが定義されています。
UpgradeOpen メソッド: 読み取りモードを書き込みモードに返る。DowngradeOpen メソッド: 書き込みモードを読み取りモードに変える。図面を編集するコマンドを作成するとき、「図面にある図形のうち、特定の条件を満たすものだけを変更する」という処理を行いたい場合があります。
この場合、次の手順で目的の処理を実現できます。
この手順を C# のプログラムとして書くと、次のようになります。
var obj = tr.GetObject(oid, OpenMode.ForRead);
if ((変更対象の条件))
{
obj.UpgradeOpen(); // 読み取りモード→書き込みモード
(obj に対する変更)
obj.DowngradeOpen(): // 書き込みモード→読み取りモード
}
IJCAD でアクティブになっている図面に対して、図形を編集するプログラムを作成してみましょう。
図面に作図されている図形のうち、線分のみを対象として、始点と終点どちらかのz座標が0でなければ、その線分の色を赤色に変えます。
作成するコマンドの名前は、CHECKLINES とします。
こちらの手順に従って開発環境を用意するか、Visual Studio プロジェクトのひな形をダウンロードします。
ひな形のプロジェクトを Visual Studio で開いたとき、参照エラーが起きている場合は、参照を設定し直してください。
Commands クラス(Commands.cs で定義されています)にコマンド実行用のメソッドを作成し、次のように処理の概略を作成します。
[CommandMethod("CHECKLINES")]
public void CheckLines()
{
// IJCAD でアクティブになっている図面の図面データベースを取得します。
var db = Application.DocumentManager.MdiActiveDocument.Database;
using (var tr = db.TransactionManager.StartTransaction())
{
// ブロックテーブルを取得します。
var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
as BlockTable;
// モデル空間のレコードを取得します。
var btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead)
as BlockTableRecord;
// モデル空間の個々の図形に対して処理を行います。
foreach (ObjectId oid in btr)
{
// 図形オブジェクトを取得します。
var obj = tr.GetObject(oid, OpenMode.ForRead);
// (※) 図形オブジェクトから情報を取得します。
}
// トランザクションをコミットします。
tr.Commit();
}
}
CHECKLINESコマンドでは図形を作図しないので、モデル空間のレコードのオブジェクトは、読み取りモードで取得します。
このため、GetObject メソッドの第2引数には OpenMode.ForRead を指定しています。
また、図形オブジェクトについても GetObject メソッドで第2引数を OpenMode.ForRead とし、読み込みモードでオブジェクトを取得しています。
上のプログラムの※部分に、線分に対する処理を追加します。
個々の図形オブジェクトは読み込みモードで取得しているので、条件を満たす線分に対してのみ UpgradeOpen メソッドを利用し、図形の色を変更できるようにします。
個々の図形に対する処理は次のようになります。
// 線分のみを対象にします。
if (obj is Line)
{
var line = obj as Line;
// 始点か終点のz座標が、0でないかどうかを調べます。
if (line.StartPoint.Z != 0 || line.EndPoint.Z != 0)
{
// 線分のプロパティを変更できるようにします。
line.UpgradeOpen();
// 線分の色を変えます。
line.ColorIndex = 1; // 赤
// オープンモードを読み込みモードに戻します。
line.DowngradeOpen();
}
}
この処理では、まず変数 obj の参照するオブジェクトが線分かどうかを、is 演算子を使って判定しています。
obj の参照する図形オブジェクトが線分ならば、as 演算子で Line クラスにキャストします。
これで、線分の始点と終点の座標が得られるので、それぞれの点のz座標を調べます。
どちらかのz座標が0でなければ、UpgradeOpen メソッドを呼び出して、線分の色を変えられるようにします。
上のコードでは、Line クラスの ColorIndex プロパティに、IJCAD のインデックスカラーの番号を設定することで、線分の色を変えています。
線分の色を変えたら DowngradeOpen メソッドを呼び出して、図形オブジェクトを読み込みモードに戻します。
これで、CHECKLINES コマンドを実行するプログラムが作成できました。
動作確認用のサンプル図面をダウンロードしておきます。
デバッグ実行を開始して、IJCAD を起動し、.NET アセンブリがロードされたら、ダウンロードした図面を開きます。

サンプル図面にはいくつかの図形が作図されており、線分については始点と終点の位置に、それぞれの座標を示す文字が作図されています。
この図面では、中央の縦線と右上の斜め線の2つの線分が、z座標が0でない端点を含んでいます。
確認用の図面を開いたら、CHECKLINES コマンドを実行します。

z座標が0でない端点を含む線分だけが赤色に変われば、コマンドが正しく作成できています。
図面データベースの図形オブジェクトを編集する方法を紹介しました。
今回作成したコマンドのように、特定の条件を満たす図形だけを編集したい場合には、UpgradeOpen メソッドと DowngradeOpen メソッドを利用して、オブジェクトのオープンモードを切り替える方法が有効です。
プラグイン開発の際にはコマンド実行時のパフォーマンスを考慮することも重要ですので、今回紹介したオープンモードの扱い方を、実際の開発に役立ててください。