IJCADプラグインの開発方法 【図形の取得】

作成日:2021.08.12更新日:2021.08.12

image

IJCAD の .NET API を利用して、図面から図形を取得する方法を紹介します。

目次

image

図形情報の取得

図面から図形を取得するには、図面データベースからブロックテーブルのレコードを取得します。

.NET API を利用して、モデル空間のブロックテーブルレコードを取得するプログラムの概略は、次のようになります。

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; // モデル空間のレコードから、図形オブジェクトを取得します。 // トランザクションをコミットします。 tr.Commit(); }

このプログラムで、変数 db は図面データベースを参照する変数です。

IJCAD でアクティブになっている図面を対象とする場合、db には Application.DocumentManager.MdiActiveDocument.Database を設定します。

図形を作図するときと同じように、作図された図形を取得するには、トランザクションオブジェクトを利用して、ブロックテーブルのレコードオブジェクトを取得します。

モデル空間のレコードオブジェクトに対して foreach を利用すると、個々の図形のオブジェクトIDを取得できます。

// btr は、ブロックテーブルのレコードです。 foreach (ObjectId oid in btr) { var obj = tr.GetObject(oid, OpenMode.ForRead); // 図形オブジェクトへの処理をここに記述します。 }

オブジェクトIDを引数として GetObject メソッドを呼び出すことにより、図形のオブジェクトを DBObject クラスのインスタンスとして取得できます。

プログラムの作成

IJCAD でアクティブになっている図面から、図形の情報を取得するコマンドを作成してみましょう。

目標

図面に作図されている図形のうち、線分のみを対象として、各線分の中点の位置に、その線分の長さを示す文字を作図します。

作成するコマンドの名前は、SHOWLENGTH とします。

ここでは、すべての図形が xy 平面上に作図されている(z座標が0でないものは存在しない)とします。

コマンドの実行結果の例を、下の図に示します。

image

線分の長さを示す文字は、以下の要件に従って作図するものとします。

  • 表記する線分の長さは小数第2位までとし、小数第3位は四捨五入する。
  • 高さは 2.5 にする。
  • 位置合わせは中央にする。

準備

こちらの手順に従って開発環境を用意するか、Visual Studio プロジェクトのひな形をダウンロードします。

ひな形のプロジェクトを Visual Studio で開いたとき、参照エラーが起きている場合は、参照を設定し直してください。

SHOWLENGTH コマンドの作成

Commands クラス(Commands.cs で定義されています)にコマンド実行用のメソッドを作成し、次のように処理の概略を作成します。

[CommandMethod("SHOWLENGTH")] public void ShowLength() { // 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.ForWrite) as BlockTableRecord; // モデル空間の個々の図形に対して処理を行います。 foreach (ObjectId oid in btr) { // 図形オブジェクトを取得します。 var obj = tr.GetObject(oid, OpenMode.ForRead); // (※) 図形オブジェクトから情報を取得します。 } // トランザクションをコミットします。 tr.Commit(); } }

上のプログラムで、モデル空間のレコードを取得する際、GetObject メソッドの第2引数を OpenMode.ForWrite として、書き込みができるようにしています。

これは、線分の長さを示す文字を、モデル空間に作図できるようにするためです。

図形の情報を取得するのみで、モデル空間に対して何も変更を加えない場合、GetObject メソッドの第2引数は OpenMode.ForRead とします。

図形の種別の判定

次に、※の部分で、個々の図形が線分かどうかを判断し、線分のみに対して目的の処理を行うようにします。

IJCAD の API で線分の図形オブジェクトを表すクラスは Line です。

C#の場合、is 演算子または as 演算子を利用して、DBObject クラスのインスタンスが Line クラスかどうかを判定できます。

if (obj is Line) { var line = obj as Line; // (※※) 線分の図形オブジェクトに対する処理 }

上の例では、変数 obj の参照するオブジェクトが Line クラスのインスタンスならば、オブジェクトのクラスを Line クラスにキャストして、処理を行います。

var line = obj as Line; if (line != null) { // (※※) 線分の図形オブジェクトに対する処理 }

線分かどうかの判定は、上の例のようにして行うこともできます。

この例では as 演算子を利用して、obj が参照するオブジェクトを Line クラスにキャストしています。

キャストができない場合は null が結果として返されるので、キャストの結果が null かどうかで、図形の種類を判別できます。

図形からの情報取得

線分の図形オブジェクトが得られたら、目的の処理を行うため、※※の箇所で、線分の長さと、それを示す文字を作図する位置を求めます。

Line クラスでは、線分の長さは Length プロパティで、始点の位置は StartPoint プロパティで、終点の位置は EndPoint プロパティで、それぞれ得られます。

このため、線分の図形オブジェクトを参照する変数 line に対して、文字を作図する位置(線分の中点)は次のように求められます。

  • x座標: (line.StartPoint.X + line.EndPoint.X) / 2
  • y座標: (line.StartPoint.Y + line.EndPoint.Y) / 2
  • z座標: 0

文字の作図

ここまでのことから、線分の中点の位置に、線分の長さを示す文字を作図する処理は次のように実装できます。

// 文字を作図する位置の座標を求めます。 var x = (line.StartPoint.X + line.EndPoint.X) / 2; var y = (line.StartPoint.Y + line.EndPoint.Y) / 2; using (var text = new DBText()) { // 表記する文字列を設定します。 text.TextString = line.Length.ToString("F2"); // 文字の高さを設定します。 text.Height = 2.5; // 文字の位置合わせを設定します。 text.HorizontalMode = TextHorizontalMode.TextCenter; text.VerticalMode = TextVerticalMode.TextVerticalMid; // 文字を位置合わせが中央の場合は、位置合わせ点の位置を設定します。 text.AlignmentPoint = new Point3d(x, y, 0); btr.AppendEntity(text); tr.AddNewlyCreatedDBObject(text, true); }

文字の作図には、GrxCAD.DatabaseServices 名前空間の DBText クラスを使います。

DBText クラスでは、表記する文字列の内容を TextString プロパティに設定し、文字の高さを Height プロパティに設定します。

位置合わせについては、横方向の合わせ方を HorizontalMode プロパティで、縦方向の合わせ方を VerticalMode プロパティで、それぞれ設定できます。

DBText クラスには、文字の位置を示す Position というプロパティがありますが、位置合わせを中央にする場合は、位置合わせ点の位置を示す AlighmentPoint プロパティに、作図したい位置を設定します。

動作の確認

動作確認用のサンプル図面をダウンロードしておきます。

デバッグ実行を開始して、IJCAD を起動し、.NET アセンブリがロードされたら、ダウンロードした図面を開きます。

image

動作確認用の図面を開いたら、SHOWLENGTH コマンドを実行します。

image

線分の長さを示す文字が作図されれば、コマンドが正しく作成できています。

まとめ

図面データベースから、図形の情報を取得する方法を紹介しました。

ここではモデル空間の図形を取得する方法を説明しましたが、同じやり方で、レイアウト上の図形や、ブロック定義中の図形も取得できます。

今回紹介した方法では、IJCAD で開かれている図面、開かれていない図面のどちらに対しても図形の情報を取得できます。

IJCAD で開かれている図面に対しては、API の SelectionFilter クラスを利用して、特定の条件を満たす図形のみを取得できます。

この方法については、別の記事で紹介します。

次の記事

関連記事

image