BIM 套件最近新增了 IFC SDK,支持读取和渲染 IFC 2x3 文件、导航已加载的 IFC 模型实体以及查看只读实体属性。本文介绍了如何开始使用该 SDK。
IFC SDK 的初始版本基于当前可用的 ODA SDK 19.12 版。
初始化 ODA IFC SDK
要初始化 IFC SDK 模块,请调用在 IfcCore.h 头文件中声明的 OdResult odIfcInitialize(bool bInitIfcGeomResource /*= true*/) 函数。
渲染几何实体并非总是必需的(例如,可能只需要遍历 IfcModel),因此提供了参数 bInitIfcGeomResource 以避免几何模块初始化。如果使用预定义参数值调用该函数,则会加载 IfcCore.dll 和 IfcGeom.dll 模块。IfcCore 初始化还会加载 Spf.tx,其中包含用于与 STEP 物理文件进行低级、独立于对象模型的工作所需的例程和基类。
读取 .ifc 文件
要读取 .ifc 文件内容,应调用 OdIfcHostAppServices::readFile()。该方法返回一个 OdIfcFile 类实例的指针,该实例包含已加载 IFC 实体(IFC 模型)的数据库。OdIfcFile 类在 OdIfc 命名空间内的“IfcFile.h”头文件中声明。
可以通过调用 OdSpf::OdSpfHeaderSectionPtr OdIfcFile::getHeaderSection() 方法访问 .ifc 文件的头部分容器。头部分包含有关 .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 中,沿着派生自 Ifc2x3 Express Schema 实体类型 IfcGeometricRepresentationContext 的实体实例创建一个迭代器:
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(类型一致),则继续。我们需要找到所需类型的所有上下文和子上下文:“Model”用于上下文,“Body”用于包含模型元素 3D 几何表示的子上下文。
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 图纸中的多面网格集的示例。还提供了两个额外的简单示例应用程序: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 – 加载文件并将其重新保存为不同的文件。