最近BIMスイートに追加されたIFC SDKは、IFC 2x3ファイルの読み込みとレンダリング、ロードされたIFCモデルエンティティのナビゲーション、読み取り専用エンティティ属性の表示をサポートしています。この記事では、SDKの使用を開始する方法について説明します。
最初のIFC SDKリリースは、現在利用可能なODA SDKsバージョン19.12に基づいています。
ODA IFC SDKの初期化
IFC SDKモジュールを初期化するには、IfcCore.hヘッダーファイルで宣言されているOdResult odIfcInitialize(bool bInitIfcGeomResource /*= true*/)関数を呼び出します。
ジオメトリエンティティのレンダリングは常に必要とされるわけではないため(例えば、IfcModelを歩くだけで十分な場合もあります)、bInitIfcGeomResourceパラメーターはジオメトリモジュールの初期化を避けるために提供されています。定義済みのパラメーター値で関数を呼び出すと、IfcCore.dllとIfcGeom.dllモジュールがロードされます。IfcCoreの初期化は、低レベルのオブジェクトモデルに依存しないSTEP物理ファイルとの作業に必要なルーチンと基本クラスを含むSpf.txもロードします。
.ifcファイルの読み込み
.ifcファイルの内容を読み取るには、OdIfcHostAppServices::readFile()を呼び出す必要があります。このメソッドは、ロードされたIFCエンティティ(IFCモデル)のデータベースを含むOdIfcFileクラスのインスタンスへのポインタを返します。OdIfcFileクラスは、OdIfc名前空間内の「IfcFile.h」ヘッダーで宣言されています。
.ifcファイルのヘッダーセクションコンテナには、OdSpf::OdSpfHeaderSectionPtr OdIfcFile::getHeaderSection() メソッドを呼び出すことでアクセスできます。ヘッダーセクションには、.ifcファイル内のモデルに関する情報フィールド、モデルの作成者/所有者に関する情報などが含まれています。ファイルデータセクションスキーマに関する情報もヘッダーセクションに保持されています。
OdIfc::OdIfcFilePtr pIfcFile = svcs.readFile(pBuffer);
OdDAI::OdSpfHeaderSectionPtr pHeader = pIfcFile >getHeaderSection(fileName);
OdDAI::OdSpfFileSchemaPtr pSchema = pHeader >getEntityByType(headerFileSchema);
OdString dataSectionSchema = pSchema->at(0);
OdIfcFileのメインエンティティコンテナを取得するには、そのメソッドOdIfcModelPtr OdIfcFile::getModel()を呼び出す必要があります。現在、ODA IFC SDKはIfc2x3スキーマのみをサポートしているため、サポートされていないファイルをロードしようとするとgetModel()はNULLを返します。
OdIfcModelPtr pModel = pIfcFile->getModel();
ジオメトリを生成するための一連のIfcGeometricalContextsを最初に決定する必要があります。ロードされたOdIfcModel内で、IfcGeometricRepresentationContextと呼ばれるIfc2x3 Expressスキーマエンティティタイプから派生したエンティティインスタンスに沿ってイテレータを作成しましょう。
OdDAIObjectIds ids = pModel->getEntityExtent(“IfcGeometricRepresentationContext”);
OdIfcHandles selContexts;
for (OdDAIObjectIds::iterator it = ids.begin(), end = ids.end(); it != end; ++it){
OdIfc::OdIfcEntityPtr pInst = it->OpenObject();
OdAnsiString strContextType;
if (pInst->getAttr("ContextType") >> strContextType)
{
「ContextType」という名前のプロパティの値がエンティティインスタンスから抽出され、strContextTypeに正常に割り当てられた場合(型が一致している場合)、続行します。モデルの要素の3D幾何学的表現を含む、目的のタイプ(コンテキストの場合は「Model」、サブコンテキストの場合は「Body」)のすべてのコンテキストとサブコンテキストを見つける必要があります。
if (strContextType.compare("Model") == 0)
{
selContexts.append(*it);
}
OdDAIObjectIds hasSubContexts;
if (pInst->getAttr("HasSubContexts") >> hasSubContexts)
{
for (OdDAIObjectIds::iterator itSub = hasSubContexts.begin(), endSub = hasSubContexts.end();
itSub != endSub; ++itSub)
{
OdIfc::OdIfcEntityPtr pSubCtx = itSub->openObject();
OdAnsiString strContextIdentifier;
if (pSubCtx->getAttr("ContextIdentifier") >> strContextIdentifier &&
strContextIdentifier == "Body")
{
selContexts.append(*itSub);
}
}
}
}
ジオメトリエンティティの構築とレンダリング
ジオメトリを構築するために、IfcGeometricRepresentationContext/SubContextハンドルの配列を埋めます。「Model」/「Body」コンテキスト/サブコンテキストは3Dエンティティを取得するのに十分です。これらの名前はIFC仕様によって事前に定義されており、他のタイプのGeometricContexts/SubContextsは必要ありません(それらはモデルの描画可能なアイテムの図式表現などを保持している可能性があります)。
pModel->setContextSelection(selContexts);
レンダリング用のジオメトリエンティティを構築します。このメソッドは、ロードされたIFCモデルのOdGiDrawableエンティティを構成します。
pModel->composeEntities ();
OdIfcFile::setGeomResource()の結果がeOkの場合、ジオメトリは正常に生成され、GsDeviceを使用してレンダリングできます。描画のルートエンティティはOdIfcProjectです。
OdIfcObjectId idProject = pIfcFile->getProjectId();
OdGiContextForIfcDatabasePtr pIfcContext = OdGiContextForIfcDatabase::createObject();
pIfcContext->setDatabase(pIfcFile);
pIfcContext->enableGsModel(true);
OdGsDevicePtr pDevice = …;
OdGsDevicePtr pIfcDevice = OdIfcGsManager::setupActiveLayoutViews(idProject, pDevice .get(), pIfcContext);
OdGsView* pView = pDevice->viewAt(0);
pView->setMode(...);
レンダリングを処理します。
pDevice->update(OdGsView::kFlatShaded);
OdResult odIfcUninitialize()を呼び出してモジュールを初期化解除します。
詳細情報
詳細とライブデモ: IFC SDK
トライアルのダウンロード: 近日公開
ODA BimIfc SDKの拡張された使用例は、Visualize/Examples/Ifc2Visualize(ODA Visualize SDKを使用したジオメトリレンダリングの例)とIfc/Exports/Ifc2Dwg(ロードされたIFCファイルから.dwg図面へポリフェースメッシュのセットとしてジオメトリをエクスポートするサンプル)にあります。さらに2つの簡単なサンプルアプリケーションも提供されています。ExIfcReadFileは、目的のIfc2x3ファイルを読み込むためだけのもの、ExIfcDumpは、ディレクトリ構造をたどり、ロードされたIfcモデルから情報を抽出することでエンティティ統計を収集するためのものです。
すでにIFC SDKを使用している、または評価している場合は、例はVisualize/Examplesインストールフォルダにあります。
- Ifc2Visualize — ODA Visualize SDKを使用して.ifcファイルからジオメトリをレンダリングする方法を示します。
- Ifc/Exports/Ifc2Dwg — ロードされた.ifcファイルからジオメトリをポリフェースメッシュのセットとして.dwg図面にエクスポートします。
- ExIfcReadFile — Ifc2x3ファイルを読み込みます。
- ExIfcDump — ディレクトリ構造をたどり、ロードされたIFCモデルから情報を抽出することでエンティティ統計を収集します。
- ExIfcModelFiller – 幾何学的エンティティを持つ有効なIFCモデルを作成します。
- ExIfcWriteFile – ファイルをロードし、別のファイルに再保存します。