development of

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

【IJCAD】データベース内のオブジェクトを選択する

ObjectGRX の強み

前回の記事ではカスタマイズするなら .NET API を使用すべきと主張しましたが、今回のは ObjectGRX のあるクラスを使用したオブジェクト選択のサンプルを紹介します。

データベースから選択セットを作成する

IJCAD の ObjectGRX には OdDbSelectionSet というクラスが存在していまして、このクラスを使用することで、データベースから選択セットを作成できます。

OdDbSelectionSet クラスは Teigha という IJCAD の DWG を読み書きするために採用しているエンジンの、ソフトウェアライブラリ特有のクラスなので 、AutoCAD の ObjectARX には存在しないと思います。

OdResBuf クラスは resbuf 構造体と同じような機能を持ったクラスで、OdDbSelectionSet::select メソッドで選択セットフィルタを設定する際に使用します。このクラスも ObjectARX には存在しないと思います。

サンプルコード

オブジェクトを全て選択するが、円以外はフィルタリングして、円のみを選択して色を変更しています。

#include "DbSSet.h"
void SampleCommand()
{
    OdDbDatabase* db = oddbHostApplicationServices()->workingDatabase();

    OdResBufPtr filter = OdResBuf::newRb(OdDb::kDxfStart, _T("CIRCLE"));
    OdDbSelectionSetPtr sset = OdDbSelectionSet::select(db, filter);
    OdDbObjectIdArray ids = sset->objectIdArray();

    for each (OdDbObjectId id in ids)
    {
        OdDbEntity* ent;
        oddbOpenOdDbEntity(ent, id, OdDb::kForWrite);
        ent->setColorIndex(1);
        ent->close();
    }
}

実行結果

サンプルコードの処理を実行したら次のような感じになります。 f:id:tknmt:20190517162951g:plain

例えば readDwgFile メソッドを使用して、メモリ上にロードしたデータベース内に対して、特定のオブジェクトのみ選択したいときに役に立つかもしれません。